0

私は以下のコードを持っています:

 // Image Processing.cpp : Defines the entry point for the console application.
 //
 //Save an available image.
 #include "stdafx.h"
 #include "cv.h"
 #include "highgui.h"
 #include "cxcore.h"
/*
The purpose of this program is to show an example of THRESHOLDING.
*/

int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src = cvLoadImage("D:\\document\\Study\\university of     technology\\semester_8\\Computer Vision\\Pics for test\\black-white 4.jpg");
IplImage* dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
IplImage* temp1 = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage* temp2 = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
cvCvtColor(src,temp1,CV_RGB2GRAY);
cvSobel(temp1,temp2,0,1,3);
cvMerge(temp2,temp2,temp2,NULL,dst);
cvNamedWindow("src",1);
cvNamedWindow("dst",1);

cvShowImage("src",src);
cvShowImage("dst",temp2);

cvWaitKey(0);

cvReleaseImage(&src);
//cvReleaseImage(&dst);
cvDestroyAllWindows();
return 0;
}

実行すると、下の図のような警告が表示されます。 ここに画像の説明を入力

それでも「countinue」ボタンをクリックすると、結果が表示されます! ここに画像の説明を入力

誰かが私に説明してくれることを願っています!

4

2 に答える 2

1

結果は正しいです。プログラムの説明はありません。xorder=0 および yorder=1 は、y 方向の一次導関数を検出していることを意味します。イメージ内の白いピクセルは、垂直方向の微分によって検出できる境界に対応します。つまり、水平方向の境界にできるだけ近くなります。これが、縦線がほとんど検出されない理由です。

CvSobel 自体は、しきい値処理とは何の関係もありません。CvSobel は、境界と輪郭を見つけるために使用される関数です。しきい値処理は、最も一般的には、グレースケール イメージから白黒イメージを作成する操作です。画像の二値化とも呼ばれます。

画像のしきい値を設定する場合は、cvThreshold と cvAdaptiveThreshold から始めます。

于 2013-03-14T18:58:48.257 に答える
0

私はそれを修正しました、ここに私のコードがあります:

 // Image Processing.cpp : Defines the entry point for the console application.
 //
 //Save an available image.
 #include "stdafx.h"
 #include "cv.h"
 #include "highgui.h"
 #include "cxcore.h"
 /*
 The purpose of this program is to show an example of Sobel method.
 */

 int _tmain(int argc, _TCHAR* argv[])
 {
IplImage* src = cvLoadImage("D:\\document\\Study\\university of technology\\semester_8\\Computer Vision\\Pics for test\\black-white 4.jpg");
IplImage* dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage* dst_x = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage* dst_y = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage* temp1 = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage* temp2 = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,1);

cvCvtColor(src,temp1,CV_RGB2GRAY);  

cvSobel(temp1,temp2,0,1,3);
cvConvertScale(temp2,dst_y,1.0,0);

cvSobel(temp1,temp2,1,0,3);
cvConvertScale(temp2,dst_x,1.0,0);

//k nen dao ham cung luc theo x va y ma nen dao ham rieng roi dung ham cvAdd.
//cvSobel(temp1,temp2,1,1,3);
//cvConvertScale(temp2,dst,1.0,0);

cvAdd(dst_x,dst_y,dst,NULL);

cvNamedWindow("src",1);
cvNamedWindow("dst",1);
cvNamedWindow("dst_x",1);
cvNamedWindow("dst_y",1);

cvShowImage("src",src);
cvShowImage("dst",dst);
cvShowImage("dst_x",dst_x);
cvShowImage("dst_y",dst_y);

cvWaitKey(0);

cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&temp1);
cvReleaseImage(&temp2);
cvDestroyAllWindows();
return 0;
 }
于 2013-03-15T13:58:31.627 に答える