2013-03-14 38 views
0

我有下面的代码:cvSobel问题 - OpenCV的

// 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; 
} 

当我运行它,有一个警告,如下图: enter image description here

,但如果我仍然点击“countinue”按钮,结果显示! enter image description here

希望有人能给我一个解释!

回答

1

结果是正确的。该程序的描述不是。您的xorder = 0和yorder = 1这意味着您正在检测y方向上的一阶导数。图像中的白色像素对应于可以通过垂直导数检测到的边界,即尽可能接近水平边界。这就是为什么垂直线几乎没有被发现。

CvSobel本身与阈值无关。 CvSobel是用于查找边界和轮廓的函数。阈值处理最常见的操作是从灰度图像创建黑白图像。它也被称为图像二值化。

如果要为图像设置阈值,请从cvThreshold和cvAdaptiveThreshold开始。

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; 
} 
+1

我们必须使用cvConvertScale功能! – 2013-03-15 13:59:02