opencv3.0霍夫圆书上的程程序 不知道为什么会导致出错

初心者55 2016-03-01 07:45:35
我把HoughCircles()之后的部分全都注释了,会在最后return 0的时候报错,应该是vector的问题了。
把求大神解决


#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>

//-----------------------------------【命名空间声明部分】---------------------------------------
// 描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
using namespace std;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{
//【1】载入原始图和Mat变量定义
Mat srcImage = imread("66.jpg"); //工程目录下应该有一张名为1.jpg的素材图
Mat midImage,dstImage;//临时变量和目标图的定义

//【2】显示原始图
imshow("【原始图】", srcImage);

//【3】转为灰度图,进行图像平滑
cvtColor(srcImage, midImage, CV_BGR2GRAY);//转化边缘检测后的图为灰度图
GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);

//【4】进行霍夫圆变换
vector<Vec3f> circles;
//如果用dstImage代替circles程序可以运行,不过这样就没意义了
//HoughCircles(midImage, dstImage, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
HoughCircles(midImage, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);

//【5】依次在图中绘制出圆
/*for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
//绘制圆心
circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
//绘制圆轮廓
circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
}

//【6】显示效果图
imshow("【效果图】", srcImage);

waitKey(0);*/

return 0;
}

运行时会出现下面的对话框
0x00007FF77358433E 处(位于 opencvtext.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
如有适用于此异常的处理程序,该程序便可安全地继续运行。
...全文
551 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
从小练武功 2019-06-27
  • 打赏
  • 举报
回复
我也遇到了同样的问题,最后是通过添加 using namespace std;这句话解决的
qq_30298625 2017-08-16
  • 打赏
  • 举报
回复
您好,我也遇到了这个问题,您对这个问题最后有没有解决方法呢?
m0_37067658 2016-12-16
  • 打赏
  • 举报
回复
引用 10 楼 u011785481 的回复:
我下载了别人的程序,不是一次把所有圆检查出来,而是一点一点地检测,这样是可以的。 vector<Vec3f> circles; vector<Vec3f> circlesFinal; for (uint i = minRadius; i < maxRadius; i += step) { HoughCircles(edgeImg, circles, CV_HOUGH_GRADIENT, 3, 10, 200, 50, i, i+step); if (circles.empty()) continue; else { circlesFinal.push_back(circles[0]); //Point center(cvRound(circles[0][0]), cvRound(circles[0][1])); //int radius = cvRound(circles[0][2]); //circle(dst, center, radius, Scalar(0, 0, 255), 2, 8, 0); circles.clear(); } }
那这样效率岂不是特别低下?有没有更好的解决方案呢?
赵4老师 2016-05-06
  • 打赏
  • 举报
回复
引用 11 楼 jeoker 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
你这个人为什么给每个问题都回答一样的没用的东西,无不无聊[/quote] 知我者谓我心忧,不知我者谓我何求。 整个IT界为什么解决每个问题都用冯·诺依曼架构这种早该过时的东西,无不无聊!
jeoker 2016-05-06
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
你这个人为什么给每个问题都回答一样的没用的东西,无不无聊
初心者55 2016-03-04
  • 打赏
  • 举报
回复
我下载了别人的程序,不是一次把所有圆检查出来,而是一点一点地检测,这样是可以的。 vector<Vec3f> circles; vector<Vec3f> circlesFinal; for (uint i = minRadius; i < maxRadius; i += step) { HoughCircles(edgeImg, circles, CV_HOUGH_GRADIENT, 3, 10, 200, 50, i, i+step); if (circles.empty()) continue; else { circlesFinal.push_back(circles[0]); //Point center(cvRound(circles[0][0]), cvRound(circles[0][1])); //int radius = cvRound(circles[0][2]); //circle(dst, center, radius, Scalar(0, 0, 255), 2, 8, 0); circles.clear(); } }
yshuise 2016-03-04
  • 打赏
  • 举报
回复
研究下自带的例子是一种方法
赵4老师 2016-03-04
  • 打赏
  • 举报
回复
建议先编译链接调试OpenCV自带的相关例子代码。
初心者55 2016-03-03
  • 打赏
  • 举报
回复
引用 6 楼 relaxisland 的回复:
[quote=引用 4 楼 u011785481 的回复:] 应该不用提前设置大小吧,vector不是第一次输入元素的时候就会自动分配足够大的内存吗,而且我那张“66.jpg”里面只有一个圆,也就是说如果程序正常运行的话输入vector里面的只有一个元素。一个包含圆心X.Y坐标和半径的元素
可是opencv为了兼容 很多 形式的结构体, 它会对数据保存的内存直接操作的, 不会利用 vector的pushback等操作的[/quote] 也就是说我该怎么样改?还是不知道哪里错和怎么样改
赵4老师 2016-03-02
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
relaxisland 2016-03-02
  • 打赏
  • 举报
回复
引用 4 楼 u011785481 的回复:
应该不用提前设置大小吧,vector不是第一次输入元素的时候就会自动分配足够大的内存吗,而且我那张“66.jpg”里面只有一个圆,也就是说如果程序正常运行的话输入vector里面的只有一个元素。一个包含圆心X.Y坐标和半径的元素
可是opencv为了兼容 很多 形式的结构体, 它会对数据保存的内存直接操作的, 不会利用 vector的pushback等操作的
初心者55 2016-03-02
  • 打赏
  • 举报
回复
Vec3f的定义长这个样子 typedef Vec<float, 3> Vec3f;
初心者55 2016-03-02
  • 打赏
  • 举报
回复
应该不用提前设置大小吧,vector不是第一次输入元素的时候就会自动分配足够大的内存吗,而且我那张“66.jpg”里面只有一个圆,也就是说如果程序正常运行的话输入vector里面的只有一个元素。一个包含圆心X.Y坐标和半径的元素
relaxisland 2016-03-02
  • 打赏
  • 举报
回复
vector<Vec3f> circles; 要设置 提前设置好大小吧
yshuise 2016-03-02
  • 打赏
  • 举报
回复
vector<Vec3f> circles; ====================== 看看Vec3f有拷贝构造函数没有?

65,183

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧