Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用openCV检测图像中的圆?_C_Opencv - Fatal编程技术网

如何使用openCV检测图像中的圆?

如何使用openCV检测图像中的圆?,c,opencv,C,Opencv,我想检测图像中的圆。这是我尝试检测图像中圆数的代码: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <stdio.h> /** @function main */ int main(int argc, char** argv) { //load image from directory IplImage* gray = cvLoadImage

我想检测图像中的圆。这是我尝试检测图像中圆数的代码:

 #include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>

/** @function main */
int main(int argc, char** argv)
{
  //load image from directory
    IplImage* gray = cvLoadImage("comb.png",0);


   // IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    CvMemStorage* storage = cvCreateMemStorage(0);

    //covert to grayscale
    cvCvtColor(gray, gray, CV_RGB2GRAY);

    // This is done so as to prevent a lot of false circles from being detected
   cvSmooth(gray, gray, CV_GAUSSIAN, 7, 7);

   IplImage* canny = cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,1);
    //IplImage* rgbcanny = cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,3);
  cvCanny(gray, canny, 10, 20, 3);

    //detect circles
    CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, gray->width/10);

    if(circles->total>0)
    printf("circles found: %d\n",circles->total);
    else
    printf("circles not found");


  return 0;
}
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括
/**@主功能*/
int main(int argc,字符**argv)
{
//从目录中加载图像
IplImage*gray=cvLoadImage(“comb.png”,0);
//IplImage*gray=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
CvMemStorage*storage=cvCreateMemStorage(0);
//隐到灰度
CVT颜色(灰色、灰色、CV_rgb2灰色);
//这样做是为了防止检测到大量假圆
cvSmooth(灰色、灰色、CV_高斯、7、7);
IplImage*canny=cvCreateImage(cvGetSize(灰色),IPL_深度_8U,1);
//IplImage*rgbcanny=cvCreateImage(cvGetSize(灰色),IPL_DEPTH_8U,3);
cvCanny(灰色,canny,10,20,3);
//检测圆
CvSeq*圆=cvHoughCircles(灰色,存储,CV_HOUGH_渐变,1,灰色->宽度/10);
如果(圆圈->总数>0)
printf(“找到的圆:%d\n”,圆->总数);
其他的
printf(“未找到圆”);
返回0;
}
但出现以下错误:- OpenCV错误:cvCvtColor文件/OpenCV/OpenCV-2.4.3/modules/imgproc/src/color.cpp第3811行中的断言失败(dst.data==dst0.data) 在引发“cv::Exception”的实例后调用terminate what():/OpenCV/OpenCV-2.4.3/modules/imgproc/src/color.cpp:3811:error:(-215)dst.data==dst0.data在函数cvCvtColor中


请告诉我这个程序有什么问题。我使用的是ubuntu linux。

你打开的
是灰色图像(
cvLoadImage(“comb.png”,0)
,其中“0”表示“灰度”)。然后尝试将这个灰色帧从RGB转换为灰色,当然这无法工作,因为您的图像已经是灰色的

只需尝试注释掉以下行:

//covert to grayscale
cvCvtColor(gray, gray, CV_RGB2GRAY);

顺便说一下,你应该使用

IplImage* gray = cvLoadImage("comb.png", CV_LOAD_IMAGE_GRAYSCALE);
而不是

IplImage* gray = cvLoadImage("comb.png", 0);

那就更清楚了。

一步一步。看起来好像你正在使用C++?你显示的代码片段只是几行长,你的问题描述说行3811异常。这是指您的代码,还是其库的一部分?你的代码在哪一行中断?。这看起来像是.lib(或.obj)与supporting.dll不兼容。是否尝试使用更大的图像和更容易找到的圆?是否检查了输入图像是否有效?不要使用OpenCV2.4的IPLIGIN格式,阅读新的C++示例