-2

画像の赤(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...

4

1 に答える 1