2017-11-21 25 views
0

クロスポストhere同じ機能が異なる結果


これは赤い色で、これらのROIのショーのための私のプライベート関数です。

Mat highlight(Mat srcImg, Mat mask) { 
    if (srcImg.size != mask.size) { 
     cout << "Your two images tried to highlight have different SIZE.\n"; 
     exit(1); 
    } 
    if (mask.channels() != 1) 
     cvtColor(mask, mask, COLOR_BGR2GRAY); 
    if (mask.type() != CV_8UC1) 
     mask.convertTo(mask, CV_8UC1); 
    threshold(mask, mask, 0, 255, THRESH_BINARY_INV + THRESH_OTSU); 
    cvtColor(mask, mask, COLOR_GRAY2BGR); 
    if (srcImg.channels() != 3) 
     cvtColor(srcImg, srcImg, COLOR_GRAY2BGR); 
    if (srcImg.type() != CV_8UC3) 
     srcImg.convertTo(srcImg, CV_8UC3); 
    dilate(mask - Scalar(0, 0, 255), mask, Mat(), Point(-1, -1), 2); 
    return srcImg - mask; 
} 

これは私のコードです。

#include<opencv.hpp> 
using namespace std; 
using namespace cv; 
Mat highlight(Mat, Mat); 
int main() { 
    Mat emptyImg = imread("test.jpg", 0); 
    Mat test = emptyImg.clone(); 

    Mat mask(5, 5, CV_8UC1, Scalar(0)); 
    for (int i = 0; i < mask.rows; i++) { 
     uchar* data = mask.ptr<uchar>(i); 
     for (int j = 0; j < mask.cols; j++) 
      if ((i + j) % 2 == 0) 
       data[j] = 255; 
    } 
    resize(mask, mask, emptyImg.size(), 0, 0, INTER_NEAREST); 
    Mat img1, img2,mask1,mask2; 
    img1 = highlight(emptyImg, mask); 
    imshow("img1", img1); 
    img2 = highlight(test, mask); 
    imshow("img2", img2); 

    waitKey(); 
    return 0; 
} 

これは私のtest imageです。私は非常に混乱しています。私は私の予想として

を次のように異なる結果を取得しますなぜ、img1img2は全く同じである必要があります。私が見逃しているものはありますか?

答えて

2

初めてimg1 = highlight(emptyImg, mask);に電話すると、maskが変更され、img1に使用されます。 highlightに再度電話すると、同じmaskが使用され、再度変更され、img2に使用されます。しかし、これを正確に引き起こしているコードは何ですか?

threshold(mask, mask, 0, 255, THRESH_BINARY_INV + THRESH_OTSU);が原因です。それはTHRESH_BINARY_INVのためにmaskを逆にします。それを再び呼び出すと、もう一度逆になります。 cv::Matは参照変数です(cv::Matはポインタのように機能する)ので、関数のパラメータに渡すと、それに加えられた変更は元のマットにも反映されます。だから私たちは.clone()を使用して、それはcv::Matのコピーを作成します。あなたのプログラムへの最も速い修正は、関​​数に渡す前にマスク.clone()になります。

デバッグ用のコードをボイルダウンします(threshold行を削除すると逆チェッカーボードが実行されません)。

using namespace std; 
using namespace cv; 
Mat highlight(Mat, Mat); 
int main() { 
    Mat emptyImg = imread("test.jpg", 0); 
    Mat test = emptyImg.clone(); 
    Mat mask(5, 5, CV_8UC1, Scalar(0)); 
    for (int i = 0; i < mask.rows; i++) { 
     uchar* data = mask.ptr<uchar>(i); 
     for (int j = 0; j < mask.cols; j++) 
      if ((i + j) % 2 == 0) 
       data[j] = 255; 
    } 
    resize(mask, mask, emptyImg.size(), 0, 0, INTER_NEAREST); 
    Mat img1, img2, mask1, mask2; 
    imshow("m1", mask); 
    img1 = highlight(emptyImg, mask); 
    imshow("img1", img1); 
    imshow("m2", mask); 
    img2 = highlight(test, mask); 
    imshow("img2", img2); 
    waitKey(); 
    return 0; 
} 
Mat highlight(Mat srcImg, Mat mask) { 
    threshold(mask, mask, 0, 255, THRESH_BINARY_INV + THRESH_OTSU); 
    return srcImg - mask; 
} 
+0

ありがとうございました。 – Make

関連する問題