1

私はOpenCVを初めて使用し、正しい方法でMAtにアクセスする方法について少し混乱しています。

2つのIplImagesrevAとrevBがあります。私はそれらのデータを使用して新しいマットを作成し、それらの行列を比較して、マットrの違いを保存しようとします。今、私は違いがどこにあるかを知る必要があります。

私の試み:

revA=cvLoadImage(argv[1], 1);
revB=cvLoadImage(argv[2],1);

IplImage* changeMap = cvCreateImage(cvGetSize(revA), IPL_DEPTH_8U, 1); 

cv::Mat a(revA);
cv::Mat b(revB);
cv::Mat r(changeMap);

cv::compare(a, b, r, CV_CMP_EQ);
imshow( "changes", r);

ウィンドウに違いがあり、それらも正しく見えますが、次のコードのようなことをしようとすると、255ではない値が見つかりません...

for(int i=0; i<r.rows; i++){
    for(int j=0; j<r.cols; j++){ 
        cv::Vec3b c = r.at<cv::Vec3b>(0,0);
        if(c[0] != 255 || c[1] != 255 || c[2] != 255){
            printf("%d %d %d\n", c[0], c[1], c[2]);  
        }
    }
}

誰かが私が間違っていることを理解できますか?

4

1 に答える 1

0

最初の問題は、3チャンネルの画像であるかのようにアクセスしようとしているが、グレースケール、つまり単一チャンネルとしてMat明確にロードされているIplImageため、次のような操作を行う必要があることです。

for(int i=0; i<r.rows; i++){
    for(int j=0; j<r.cols; j++){
        float pixel = r.at<float>(i,j);
    }
}

2番目の問題は上記のコードですでに修正されていますが、ループのすべての反復では0,0なく、常にインデックスでピクセルにアクセスしていました。i,jヘヘ

于 2012-07-21T03:09:07.557 に答える