3

私は OpenCV を使用してアプリケーションを作成しています。最近、cv::Mat オブジェクトが参照によって関数に渡されたときに奇妙なことが起こることに気付きました。コードは次のとおりです。

cv::Mat img1=cv::imread(argv[1]);
cv::Mat img2=cv::imread(argv[2]);

double scale=0.4;
int thr=52; 

//resize image
cv::Mat tmp;
img1.copyTo(tmp);
cv::resize(tmp,img1,cv::Size(),scale,scale);
img2.copyTo(tmp);
cv::resize(tmp,img2,cv::Size(),scale,scale);

cv::Mat im1,im2;

try
{
    cv::Sobel(img1,im1,CV_8U , 0/*x order*/, 1/*y order*/,5/*kernel size*/,1/*scale*/);
    cv::Sobel(img2,im2,CV_8U , 0/*x order*/, 1/*y order*/,5/*kernel size*/,1/*scale*/);
}
catch(...)
{
    std::cout << "Something went wrong calculating Sobel!" << std::endl;
}

cv::imshow("im1",im1);
cv::imshow("im2",im2);

//create empty mat with the same size as im1, im2
cv::Mat bin1(im1.size().height, im1.size().width, CV_8UC1);
cv::Mat bin2(im2.size().height, im2.size().width, CV_8UC1);


std::cout << "_________OUT_________" << std::endl;
std::cout << im1.size().width << " " << bin1.size().height << std::endl;
std::cout << im2.size().width << " " << bin2.size().height << std::endl;


getExtreme(im1,bin1,thr);
getExtreme(im2,bin2,thr); 

getExtreme 関数は次のように定義されています。

 void getExtreme(cv::Mat &img, cv::Mat &dst,int prag)
 {

    int x=img.size().width;
int y=img.size().height;
    std::cout << "_________________IN______________________" << std::endl;
    std::cout << x << " " << dst.size().width << std::endl;
    std::cout << y << " " << dst.size().height << std::endl;



    int i,j;

for (i=0;i<x;i++)
{ 
            for (j=0;j<y;j++)
    {
                    if(img.data[img.channels()*img.cols*j+i]>prag)
                    dst.data[dst.channels()*dst.cols*j+i]=255; 
    }
}
 }

私が印刷しているサイズの画像は同じですが、プログラムの出力は次のとおりです。

__出_ _ 819 819 819 819 _ _ _ _____ _ _ _ _ _ 819 819 435 435 __ _ __ _ __ _ _ _ _ ____ 819 819 435 435

そのため、何らかの理由で bin1 と bin2 の画像 (cv::Mat) のサイズが変わります。ただし、ダブルスケール= 0.4を設定すると; double scale=1; に変更すると、画像のサイズは変更されずに元のサイズが保持され、画像のサイズは関数の外側と内側で一致します。

__出力_ _ 2048 1088 2048 1088 _ _ _ ____入力_ _ _ _ _ _ 2048 2048 1088 1088 __ _ __ _ _イン_ __ _ __ _ ____ 2048 2048 1088 1088

私は何を間違っていますか?サイズ変更はマット オブジェクトにどのように影響しますか? 参照渡しの場合、関数内に同じオブジェクトが必要です。

ありがとう

4

1 に答える 1

1

関数への参照としてイメージを渡しても、サイズは変更されません。あなたのコードを簡単に見てください。特定のエラーは見られませんが、プログラムの別の部分にメモリアクセスがあり、データが破損している可能性がありますが、プログラムはクラッシュしません。プロファイラーでプログラムをチェックする必要があります。

それにもかかわらず、別のアドバイスとして、関数 getExtreme は単純なしきい値操作を実行しているようです。cv::thresholdこれは、cv::Matを使用するか、またはcv::Mat で使用して、OpenCV で実現できます(行列式operator>を参照してください)。例:

cv::threshold(im1,bin1,thr, 255, CV_THRESH_BINARY);
cv::threshold(im2,bin2,thr, 255, CV_THRESH_BINARY);

また

bin1 = im1 > thr;
bin2 = im2 > thr;  
于 2012-10-16T08:16:22.953 に答える