
サイズが同じ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;
}
===
No.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チャンネルになってますか?
大変申し訳ありません、せっかくお返事いただいたのにお礼とクローズをしていませんでした。
アドバイスくださってすぐに画像を確認し、
念のため画像を入れ替えたところうまくいきました。
すぐに解決することができました、ありがとうございました。
重ねて、お礼が遅くなりましたことをお詫びいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外部javascriptの重複を防ぐには
-
OpenCVで固定枠で画像を操作す...
-
opencv、プログラム初心者です。
-
MAX関数を使ってからLEFT JOIN...
-
1枚の画像をクリックすると複数...
-
透過pngの透明部分以外をクリッ...
-
クリックで背景変更するタグ
-
離れた場所にマウスオーバーで...
-
createElementで作成した要素を...
-
JS <a></a>タグ内のリンク先ア...
-
click範囲の指定
-
jQueryで特定のURLの時のみ表示
-
jQueryでネスト構造の<li>がク...
-
jspでcssが読み込めない
-
1枚の画像をクリックして複数の...
-
Webサイト作成 プログレスバー ...
-
他のPGMを呼び込むロジックにつ...
-
【html5】canvasでの文字の形の...
-
デフォルト非表示にしたい。【t...
-
DOM sort list table
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
外部javascriptの重複を防ぐには
-
libjpegライブラリの使い方につ...
-
複数画像のランダム複数表示(...
-
pythonのpygameでキャラクター...
-
MFCで画像を表示させているので...
-
JavaScriptで変更した属性の元...
-
HTMLからimgのsrcのみを正規表...
-
OpenCVの実行エラー
-
画像が表示でnull; this.src
-
複数の画像をフェードイン・ア...
-
createElementによる空要素の生...
-
ダイアログから画像ファイルは...
-
OpenCV での画素値の比較について
-
VC++2005で画面上にGIF画像(透...
-
条件分岐でキーが入力されてい...
-
画像ギャラリー
-
指定したフォルダの画像を一括...
-
error LNK2019 未解決のシンボ...
-
"lightbox"の"CLOSE"ボタンクリ...
-
リンク先を動的に変更する
おすすめ情報