掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ScanLineを用いて、ライントレースをしたいです。(Delphi6 Personal) (ID:43775)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんにちは、太郎と申します。 プログラミング初心者ですが、Delphi6を用いてライントレースみたいなことをしようと考えています。 BitmapやJpeg画像にある物体に対し、ScanLineを用いてその物体の外形の境目付近のRGB値を取得して、その物体の形を判断しようというものです。 普通に2値化したり最小二乗法を用いてやる方法もあるようですが、今回はこの方法を敢えてやってみたいと思った所存です。 コピー機のように縦に何ピクセルかずつ、横にRGB値を取得していく感じです。 その物体の上部が出来たら次は右分、その次は下部、そして左部とやっていくイメージです。 (つまり、上・下部は縦何ピクセルかを横に、左右部は横何ピクセルかを縦にスキャンしていく感じです。) 今のところ、スタート位置の座標だけ自分で打ち、そこから横に読み込んでいくところまではできました。 次は縦に読み込んでいくのですが、ボタン一つで縦も横もすべてやりたいというのが本音で、できれば楕円やピーナッツのようなものを出来るようにしたいです。 今のところのやり方は、以下の通りです。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Jpeg; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } procedure OutputRGB(Col: TColor); public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.OutputRGB(Col: TColor); type TRGB = packed record case Integer of 0: (Col: TColor;); 1: (R: Byte; G: Byte; B: Byte; I: Byte;); end; var R, G, B : Byte; begin // 関数(マクロ扱い)を使った、TColor値 → R,G,Bの取り出し R:=GetRValue(Col); G:=GetGValue(Col); B:=GetBValue(Col); Memo1.Lines.Add(' (R): '+InttoStr(R)+ ' (G): '+InttoStr(G)+ ' (B): '+InttoStr(B)); end; procedure TForm1.Button1Click(Sender: TObject); const // Bmpファイルを指定する BMPFile='C:\Users\User\Pictures\My PictureⅠ\ファイル名.bmp'; var BMP: TBitmap; i,j:integer; begin BMP:=TBitmap.Create; try BMP.LoadFromFile(BMPFile); Memo1.Lines.Add('--------------------'+ExtractFileName(BMPFile)); for i:=0 to 10 do begin //(x,y)=(0,0)〜(10,10)の場合 for j:=0 to 10 do begin Memo1.Lines.Add(inttoStr(i)+'---------------------'); Memo1.Lines.Add(inttoStr(j)+'---------------------'); OutputRGB(BMP.Canvas.Pixels[i, j]); end; end; finally BMP.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); const // Jpegファイルを指定する JPGFile='C:\Users\User\Pictures\My PictureⅠ\ファイル名.jpg'; var JPG: TJPEGImage; BMP: TBitmap; i,j:integer; begin JPG:=TJPEGImage.Create; BMP:=TBitmap.Create; try JPG.LoadFromFile(JPGFile); BMP.Assign(JPG); Memo1.Lines.Add('----------'+ExtractFileName(JPGFile)); for i:=0 to 10 do begin //(x,y)=(0,0)〜(10,10)の場合 for j:=0 to 10 do begin Memo1.Lines.Add(inttoStr(i)+'-----------------'); Memo1.Lines.Add(inttoStr(j)+'-----------------'); OutputRGB(BMP.Canvas.Pixels[i, j]); end; end; finally BMP.Free; JPG.Free; end; end; end. 初心者故、スマートに出来ていないところ、拙いところはかなりあるかと思いますが、ご助言頂けると幸いです。 また、ここをこうすると良いといった改善策等もございましたら、ご教授頂けると嬉しいです。 質問に関してわからない事等ございましたら、知識はあまりないかもしれませんが、できる限り答えさせて頂きたいと思います! どうぞよろしくお願いしますm(__)m
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.