基本的に、以下の出力画像をカラー(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;
}
現在、これは入力としてグレースケール画像を期待するように設定されています。カラー入力画像を受け入れ、カラー出力画像を返すように調整する方法を求めていると思います。あまり変更する必要はありません。
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による処理のためにグレーに変換し、見つかった円を元のカラー画像に適用して出力します。
CvtImageルーチンは、灰色の要素を各ピクセルの3つの要素R、G、Bのそれぞれに単純にコピーします。つまり、ピクセルグレー値が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
貼り付けたコードはカラー画像を返しています。
すでにcvtColor(img、cimg、CV_GRAY2RGB)を実行していますが、cimgがグレースケールに変換されるのをどこでも見ません!
imshow("c",cimg);
waitKey(0);
return cimg;