cvSobel问题 - opencv

时间:2013-03-14 17:36:15

标签: 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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果要对图像进行阈值处理,请从cvThreshold和cvAdaptiveThreshold开始。

答案 1 :(得分: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;
 }