ラベルを付けた画像の左上,右下の点を求めたいのですが,下のように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;
ここ
> https://www.petitmonte.com/bbs/answers?question_id=5247
まず、
Xmin := AfterBmp.Height; は Xmin := AfterBmp.Width;
ではないでしょうか。
ラベルというのが何なのか、文面からは判断できませんので、補足をなされたほうがよろしいかと思います。
TLabelとかではなく、「ラベル=画像に合成された別の小さい、字など描画された領域」ということのように思えるのでしょうが、そうでしょうか?
それを検出するために画像をフルスキャンして、領域を判定しようとしているようなコードにみえるのですが。
他のかたがたも、これ以上は、現段階では回答できない気がします。
失礼しました。そういうことですか、よくわかりました。
>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
>https://www.petitmonte.com/bbs/answers?question_id=5247
もそうですが、間違い(まくり)のコメントは意味がありません。
このコメントを見るだけで頭が痛くなります。本当に自分でコーディングしているんでしょうか?
回答者は第三者です。あなたの教師や「面倒を見る人」ではありません。
横柄に(いやこの場合けだるげに)質問するのは「答えを教えるな」といっているも同然です。
コードを貼り付けるならば、コピペしたら一発で動作するようなものでなければあまり意味がないと思いませんか?
ツイート | ![]() |