17

基本的に、以下の出力画像をカラー(RGB)に変換しようとしています。このコードが現在出力する画像はグレースケールですが、私のアプリケーションではカラーとして出力したいと考えています。画像を変換する場所を教えてください。

また、以下のコードは C++ であり、openCV の関数を使用しています。iphone アプリケーションでこのコードを使用するためにラッパーを使用していることに注意してください。

cv::Mat CVCircles::detectedCirclesInImage(cv::Mat img, double dp, double minDist, double    param1, double param2, int min_radius, int max_radius) {
//(cv::Mat img, double minDist, int min_radius, int max_radius)


if(img.empty())
    {
    cout << "can not open image " << endl;
    return img;
    }
Mat cimg;
medianBlur(img, img, 5);

cvtColor(img, cimg, CV_GRAY2RGB);

vector<Vec3f> circles;
HoughCircles(  img      //InputArray 
             , circles  //OutputArray
             , CV_HOUGH_GRADIENT  //int method
             , 1//dp              //double       dp=1   1 ... 20
             , minDist         //double minDist=10 log 1...1000
             , 100//param1          //double  param1=100
             , 30//param2          //double  param2=30  10 ... 50
             , min_radius      //int  minRadius=1   1 ... 500
             , max_radius      //int  maxRadius=30  1 ... 500
             );

for( size_t i = 0; i < circles.size(); i++ )
    {
    Vec3i c = circles[i];
    circle( cimg, Point(c[0], c[1]), c[2], Scalar(255,0,0), 3, CV_AA);
    circle( cimg, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, CV_AA);
    }


return cimg;
}
4

4 に答える 4

22

これは現在、グレースケール画像を入力として期待するように設定されています。カラー入力画像を受け入れてカラー出力画像を返すように適応させる方法を尋ねていると思います。多くを変更する必要はありません。

cv::Mat CVCircles::detectedCirclesInImage(cv::Mat img, double dp, double minDist, double  param1, double param2, int min_radius, int max_radius) {

  if(img.empty())
        {
        cout << "can not open image " << endl;
        return img;
        }
  Mat img;

  if (img.type()==CV_8UC1) {
              //input image is grayscale
    cvtColor(img, cimg, CV_GRAY2RGB);

  } else {
              //input image is colour
    cimg = img;
    cvtColor(img, img, CV_RGB2GRAY);
  }

残りはそのままです。

入力画像がカラーの場合、HoughCircles で処理するためにグレーに変換し、見つかった円を元のカラー画像に適用して出力します。

于 2013-01-28T21:59:22.420 に答える
0

貼り付けたコードは、色付きの画像を返しています。

あなたはすでに cvtColor(img, cimg, CV_GRAY2RGB) を実行していますが、cimg がどこにもグレースケールに変換されていないことを確認するには、この関数から戻る前に表示してみてください:

imshow("c",cimg);
waitKey(0);
return cimg;
于 2013-01-28T21:50:48.173 に答える
0

cvtImage ルーチンは、グレー要素を各ピクセルの R、G、B の 3 つの要素のそれぞれに単純にコピーします。つまり、ピクセルのグレー値が 26 の場合、新しい画像は R = 26、G = 26、B = 26 になります。

表示される画像は、3 つのカラー コンポーネントがすべて含まれているにもかかわらず、依然としてグレースケールに見えます。基本的に行ったことは、同じ画像を保存するために必要なスペースを 3 倍にすることだけです。

実際に画像に色を表示したい場合 (表示時に)、グレースケールから元の色に戻すことは本当に不可能です。ただし、画像に疑似カラーリングまたは偽のカラーリングを行う手段があります。

http://en.wikipedia.org/wiki/False_color

http://blog.martinperis.com/2011/09/opencv-pseudocolor-and-chroma-depth.html

http://podeplace.blogspot.com/2012/11/opencv-pseudocolors.html

于 2013-01-28T22:22:08.410 に答える
-1

入力カラー画像に円を描くことができます。openCVで提供されているドキュメントを確認してください

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

于 2013-01-29T06:06:45.923 に答える