座標の4点を習得することについて


wasabi  2007-11-25 08:55:43  No: 28666

ラベルを付けた画像の左上,右下の点を求めたいのですが,下のようにDelphiで組んだのですが, うまくいきません.どこがちがうのかご指摘頂けるとうれしいです.よろしくお願いします.

  for x:=1 to LabelNum do
  begin
   //初期化する
    Ymax := 0;
    Ymin := AfterBmp.Height;
    Xmax := 0;
    Xmin := AfterBmp.Height;
    a:=0;
    b:=0;
    for i:=0 to AfterBmp.Width-1 do//
    begin
      for j:=0 to AfterBmp.Height-1 do
      begin
        //ラベルの入ってる座標にきたら画素数の総和をとる
        if Image[i,j] = x then
        begin
          a:=i;
          b:=j;

          if (Ap[i*3] <> 255) or (Ap[i*3] <> 0) then
          begin
            if b > Ymax  then
            begin
              Ymax := b;
            end;
            if b < Ymin then
            begin
              Ymin := b;
            end;
            if a > Xmax  then
            begin
              Xmax := a;
            end;
            if a < Xmin then
            begin
              Xmin := a;


ここ  2007-11-26 02:54:56  No: 28667

ここ
https://www.petitmonte.com/bbs/answers?question_id=5247


通りすがり。  2007-11-26 03:04:15  No: 28668

まず、
Xmin := AfterBmp.Height; は Xmin := AfterBmp.Width;
ではないでしょうか。

ラベルというのが何なのか、文面からは判断できませんので、補足をなされたほうがよろしいかと思います。

TLabelとかではなく、「ラベル=画像に合成された別の小さい、字など描画された領域」ということのように思えるのでしょうが、そうでしょうか?

それを検出するために画像をフルスキャンして、領域を判定しようとしているようなコードにみえるのですが。
他のかたがたも、これ以上は、現段階では回答できない気がします。


通りすがり  2007-11-26 03:06:16  No: 28669

失礼しました。そういうことですか、よくわかりました。


KHE00221  2007-11-26 06:30:22  No: 28670

>for j:=0 to AfterBmp.Height-1 do 
>begin 
>  Ap := AfterBmp.ScanLine[j]; //2値画像の列ポインタ取得 
>  for i:=0 to AfterBmp.Width-1 do 
>  begin 
>    //画素が黒でラベル付けされていない場合 
>    if (Ap[i*3] = 0) and (Image[i,j] = 0) then 
>    begin 

ここで I*3 しているのは何故ですか?

pf1bitの場合 1Byte に 8ドット分の情報が書かれています

I*3の位置を見に行くわけでビットマップ領域外を見に行ってますよ?

たとえば

var
    A : pByteArray;
begin
    Image1.Picture.Bitmap.PixelFormat := pf1bit;
    Image1.Picture.Bitmap.SetSize(100,100);
    Image1.Picture.Bitmap.Canvas.Pen.Color   := $01000001;
    Image1.Picture.Bitmap.Canvas.Brush.Color := $01000000;
    Image1.Picture.Bitmap.Canvas.FillRect(Rect(0,0,100,100));
    Image1.Picture.Bitmap.Canvas.MoveTo(2,0);
    Image1.Picture.Bitmap.Canvas.LineTo(2,10);
    A := Image1.Picture.Bitmap.ScanLine[0];
    Caption := IntToStr(A[0]);
end;

等として MoveTo と LineTo の位置をずらすと分かると思います

0=128 1=64 2=32 3=16 4=8 5=4 6=2 7=1


まず  2007-11-26 18:59:04  No: 28671

>https://www.petitmonte.com/bbs/answers?question_id=5247
もそうですが、間違い(まくり)のコメントは意味がありません。
このコメントを見るだけで頭が痛くなります。本当に自分でコーディングしているんでしょうか?

回答者は第三者です。あなたの教師や「面倒を見る人」ではありません。
横柄に(いやこの場合けだるげに)質問するのは「答えを教えるな」といっているも同然です。

コードを貼り付けるならば、コピペしたら一発で動作するようなものでなければあまり意味がないと思いませんか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加