改用opencv3.3 就一直报错怎么破

guanyonglai 2017-08-26 03:51:50
本来我的程序是在 VS2010 + opencv2.4.9 下跑的没问题,这些天重新装了 VS2015 + opencv3.3 遇到一些库函数的调用经常出现中断错误,比如这次在findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );处发生中断,但是语句根本没问题了,错误列表也是空的,是新版本的opencv兼容性不好吗?以下是完整的代码,烦请大神解答。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

Mat src; Mat src_gray;
//int thresh = 100;
//int max_thresh = 255;
RNG rng(12345);

/// 函数声明
//void thresh_callback(int, void* );

/** @主函数 */
int main( int argc, char** argv[] )
{
/// 载入原图像, 返回3通道图像
src = imread( "6.jpg", 1 );////为什么图片 66 和 6 轮廓数目不一样嫩?,要加绝对值,,见下面
imshow("原图,这是自己改写的",src);
/// 转化成灰度图像并进行平滑
cvtColor( src, src_gray, CV_BGR2GRAY );
blur( src_gray, src_gray, Size(5,5) );

/// 创建窗口
char* source_window = "Contours";//这里的Contours原来都是Source,被我小小改了下
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );

//***************************************************************************************************
Mat threshold_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

/// 使用Threshold检测边缘
threshold( src_gray, threshold_output, 124, 255, THRESH_BINARY );//CV_THRESH_OTSU
imshow("阈值图",threshold_output);
/// 找到轮廓
findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );//CHAIN_APPROX_NONE全体,CV_CHAIN_APPROX_SIMPLE,,,RETR_TREE

/// 多边形逼近轮廓 + 获取矩形和圆形边界框
vector<vector<Point> > contours_poly( contours.size() );
//vector<Rect> boundRect( contours.size() );
//vector<Point2f>center( contours.size() );
//vector<float>radius( contours.size() );

for( int i = 0; i < contours.size(); i++ )
{
if(i==1)//这里控制只输出第二层轮廓,
{
approxPolyDP( Mat(contours[1]), contours_poly[i], 0, true );//逼近多边形曲线,数字表示多边形的近似程度
}}

for(int i=0;i<10;i++)//输出第二层轮廓的前十个坐标点
{
cout<<contours[1][i]<<endl;

}
cout<<"输出第一个轮廓第5个点的y坐标 "<<contours[1][5].y<<endl;//试试看输出轮廓第一个点的纵坐标 y y y y y y y y y y
//printf("dian%d",contours[1].total);

/// 画多边形轮廓
Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
//cvtColor( drawing, drawing, CV_BGR2GRAY );

int nn=-1;//////////////////// 这个是自己想出来的 计算边界点个数
for( int i = 1;; i++ )
{
nn++;//nn>3 控制不要在刚开始就判定边界结束,而要在nn足够大 ,绕一圈回来后再判断边界结束
if(nn>3&&( abs(contours[1][i].y-contours[1][0].y)<2)&&( abs(contours[1][i].x-contours[1][0].x)<2))break;
//记得这里一定要加绝对值,不然遇到两个峰值一样的图片会出错,如图6,,,还有这里最好写小于2防止出错!!!
}
nn=nn+2;
printf("这个轮廓的边界点数 大概是 %d\n",nn);
//double cvArcLength(contours[1], 1 );//????????????????

for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar(0,0,255 );
//if(contours.size()==2)
drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );// 这里的 i 换成 1 就表示不画出最外层矩形轮廓,4表示四连通,8表示八连通,CV_AA表抗锯齿
//rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 ); //显示矩形的外框
//circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
}
//Mat imageROI= drawing(Rect(2,2,drawing.cols-4,drawing.rows-4));
/// 显示在一个窗口
Mat gray;
cvtColor(drawing,gray,COLOR_BGR2GRAY);
//***************************************************************试试前十个坐标到底从哪开始的
for( int i4 = 0; i4< 10; i4++ )//宝宝 试探出图3的 边界点 总共 有677个点(为什么后来又试探出是736??) *********** ******** *************************
{
gray.at<uchar>(contours[1][i4])=33;
}
imshow( "gray", gray );
printf("轮廓数%d\n", contours.size());
namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
// Mat imageROI;
// for( int i = 5; i< 2223332; i++ )
//{imageROI= drawing(Rect(1,1,122,122));}
imshow( "Contours", drawing );
//imshow( "imageROI", imageROI );
imwrite("drawing.jpg",drawing);
//imwrite("gray.jpg",gray);


waitKey(0);
return(0);
}

...全文
2338 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
berlinpand 2017-12-14
  • 打赏
  • 举报
回复
引用 3 楼 liangqingzhi 的回复:
我用QT5.8 + opencv3.2跑你的代码没有报错。前段时间试过用CMake编译OpenCV3.3库,死活不成功, 后来下载3.2的源码来编译,一下就好了,所以现在用的是3.2版。
你好,我想问问不想使用opencv3.3要改用3.2需要把3.3删除吗?还是直接配置3.2就可以?
guanyonglai 2017-09-14
  • 打赏
  • 举报
回复
引用 3 楼 liangqingzhi 的回复:
我用QT5.8 + opencv3.2跑你的代码没有报错。前段时间试过用CMake编译OpenCV3.3库,死活不成功, 后来下载3.2的源码来编译,一下就好了,所以现在用的是3.2版。
x谢谢提醒,最新版的估计还是不稳定,
老之 2017-09-13
  • 打赏
  • 举报
回复
我用QT5.8 + opencv3.2跑你的代码没有报错。前段时间试过用CMake编译OpenCV3.3库,死活不成功, 后来下载3.2的源码来编译,一下就好了,所以现在用的是3.2版。
guanyonglai 2017-08-28
  • 打赏
  • 举报
回复
错误列表是空的,只是中断,,其实是没错的,不是程序问题,不知道问题出在哪里
沐阳2100 2017-08-28
  • 打赏
  • 举报
回复
建议贴出output中error信息!

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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