アプリ版:「スタンプのみでお礼する」機能のリリースについて

サイズが同じ2枚のbmp画像(img1とimg2)の色をピクセルごとに比較し、同じ色ならそのピクセルを白、違う色なら黒にして、3枚目(img3)の画像を生成するコードを書いています。
imgとimg2は同じ画像ですが、img2にのみ「あ」という文字が書いてあります。うまくいけばimg3には、白い背景に「あ」と黒く表示されるはずです。
ところが、結果に「あ」と表示されません。ピクセル単位で比較していますが、白い背景に、まだらなな黒色と、2~3ミリ四方の同じ大きさの黒い四角形もたくさん(規則的にではなく、ランダムに)表示されます。
img1と2と3が、それぞれ違うピクセルを参照しているのだろうかと、自分なりに調べていますが、どこがまずいのかわからず困っています。どなたかおわかりになれば、ぜひアドバイスをいただけると助かります。
どうぞ宜しくお願い致します。

===
int
main (int argc, char :: argv)
{
int x, y, i;
uchar p1[3], p2[3];
IplImage *img1, img2, img3;

img1 = cvLoadImage ("D:\\...\\ichimaime.bmp", CV_LOAD_IMAGE_COLOR);
img2 = cvLoadImage ("D:\\...\\nimaime.bmp", CV_LOAD_IMAGE_COLOR);
img3 = cvCreateImage(cvSize (100, 100), IPL_DEPTH_8U, 3);
cvZero (img3);

for (y = 0 ; y < img1->height; y++) {
for (x = 0 ; x < img1->width, x++) {

//一枚目の画素値
p1[0] = img1->imageData[img->widthStep * y + x * 3]; // B
p1[1] = img1->imageData[img->widthStep * y + x * 3 + 1]; // G
p1[2] = img1->imageData[img->widthStep * y + x * 3 + 2]; // R
//二枚目の画素値
p2[0] = img2->imageData[img->widthStep * y + x * 3]; // B
p2[1] = img2->imageData[img->widthStep * y + x * 3 + 1]; // G
p2[2] = img2->imageData[img->widthStep * y + x * 3 + 2]; // R

if ( p1[0]!=p2[0] || p1[1]!=p2[1] || p1[2]!=p2[2] ) { /*もし違う色なら黒にする*/

img3-> imageData[img3->widthStep * y + x * 3] = 0;
img3-> imageData[img3->widthStep * y + x * 3 +1] = 0;
img3-> imageData[img3->widthStep * y + x * 3 +2] = 0;

}else{ /*もし同じ色なら白にする*/

img3-> imageData[img3->widthStep * y + x * 3] = 255;
img3-> imageData[img3->widthStep * y + x * 3 +1] = 255;
img3-> imageData[img3->widthStep * y + x * 3 +2] = 255;
}
}
}

cvNmaedWindow(“Image”, CV_WINDOW_AUTOSIZE);
CVsHOWiMAGE (“Image”, img3);
cvWaitKey(0);

cvDestroyWindow(“Image”);
cvReleaseImage (&img1);
cvReleaseImage (&img2);
cvReleaseImage (&img3);
return 0;
}
===

A 回答 (1件)

書き写したのでしょうか、このプログラムにはいろいろ間違いが多くてそのままでは動かなかったですが、文法間違いを直したら、白地に黒で文字が浮びましたよ。



それぞれの画像サイズは同じ100x100ですか?

> //一枚目の画素値
> p1[0] = img1->imageData[img->widthStep * y + x * 3]; // B
> p1[1] = img1->imageData[img->widthStep * y + x * 3 + 1]; // G
> p1[2] = img1->imageData[img->widthStep * y + x * 3 + 2]; // R
> //二枚目の画素値
> p2[0] = img2->imageData[img->widthStep * y + x * 3]; // B
> p2[1] = img2->imageData[img->widthStep * y + x * 3 + 1]; // G
> p2[2] = img2->imageData[img->widthStep * y + x * 3 + 2]; // R

となってますけど、それぞれ
p1[0] = img1->imageData[img1->widthStep * y + x * 3]; // B
p2[0] = img2->imageData[img2->widthStep * y + x * 3]; // B
になってますか?

img1,img2はちゃんと 8bit、3チャンネルになってますか?
    • good
    • 0
この回答へのお礼

大変申し訳ありません、せっかくお返事いただいたのにお礼とクローズをしていませんでした。
アドバイスくださってすぐに画像を確認し、
念のため画像を入れ替えたところうまくいきました。
すぐに解決することができました、ありがとうございました。
重ねて、お礼が遅くなりましたことをお詫びいたします。

お礼日時:2011/06/16 21:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!