画像の赤(clRed)、緑(clGreen)、青(clBlue)の割合など、pIplImage(Delphiを使用しています)の色の割合を取得するにはどうすればよいですか。
これをOpenCvでシミュレートしたかったimg.Canvas.Pixels[0, 0]
のですが、画像をピクセルごとに処理する方法がわかりませんでしたが、方法がわかりませんでした。
例:
procedure TForm1.Button4Click(Sender: TObject);
var i, j, r, b, g, tot : integer;
begin
r := 0; b := 0; g := 0;
for i := 0 to Image1.Width - 1 do
for j := 0 to image1.Height - 1 do
if image1.Canvas.Pixels[i,j] = clRed then
inc(r)
else if image1.Canvas.Pixels[i,j] = clBlue then
inc(b)
else if image1.Canvas.Pixels[i,j] = clGreen then
inc(g);
tot := Image1.Width * Image1.Height;
showmessage('Red %:' + IntToStr(r div tot)+#13#10+
'Green %:'+IntToStr(g div tot)+#13#10+
'Blue %:'+IntToStr(b div tot));
end;
私の検索ではpIplImage
、( を使用して) を Matに変換しcvMat()
、cvGet2D で配列に分割して、RGB とグレーの 4 つの配列を推測する必要があることがわかりました。しかし、次のステップはわかりませんでした...
var
mat : TCvMat;
res : TCvScalar;
begin
object_filename := 'd:\1.bmp';
image := cvLoadImage(pcvchar(@object_filename[1]), CV_LOAD_IMAGE_UNCHANGED);
mat := cvMat(image.width, image.height, 0, image);
for i := 0 to mat.rows - 1 do
for j := 0 to mat.cols - 1 do
begin
res := cvGet2D(@mat, i, j);
writeln('red: ', res.val[0]:2:2);
writeln('green: ', res.val[1]:2:2);
writeln('Blue: ', res.val[2]:2:2);
writeln('Gray: ', res.val[3]:2:2);
writeln;
end;
readln;
end.
しかし、それは実際の値を持つ val[0] のみを返し、残りはすべてゼロです。
最後に、OpenCV で pIplImage を使用して色の割合を計算する最速の方法は何ですか? 少ない時間、メモリ、CPU...