关于MFC中OpenCV图像处理使用cvFindContours引起的中断错误

来源:互联网 发布:天拓网络 编辑:程序博客网 时间:2024/04/30 20:17

MFC中OpenCV图像处理使用cvFindContours引起的中断错误

最近把之前用OpenCV做的图像处理加入到了MFC中,但是发现运行出现了中断错误。检查了N边也没发现错误。一句一句调试之后发现问题出在
cvFindContours()这里,找了N多办法,最终解决了。不是程序的问题,下面记录下解决方法。

运行结果:




解决方法:

【项目】->【属性】->【配置属性】->【C/C++】->【代码生成】->【运行时库】,设置为多线程DLL(/MD)】;

【项目】->【属性】->【配置属性】->【常规】->【MFC的使用】,设置为在共享DLL中使用MFC 】。


这时,即可解决问题,有时可能会出现,如下warning :
warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;使用 /NODEFAULTLIB:library

解决方法:

【项目】->【属性】->【配置属性】->【连接器】->【输入】->【忽略指定库】,输入:msvcrt.lib

这下就完美解决了。

我的代码如下:

void CReadDlg::AreCout(){/*  findContours后会对输入的2值图像改变,所以如果不想改变该2值图像,需创建新mat来存放,findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似  */// 【7】找到轮廓 获取每个轮廓的每个像素 findContours( out, g_vContours, g_vHierarchy,CV_RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0) );  N_led = g_vContours.size() ;printf(" > 区域个数:%d \n", N_led );  // 【8】计算矩vector<Moments> mu(g_vContours.size() );for(unsigned int i = 0; i < g_vContours.size(); i++ )mu[i] = moments( g_vContours[i], false ); // 【9】计算中心矩vector<Point2f> mc( g_vContours.size() );for( unsigned int i = 0; i < g_vContours.size(); i++ ) {mc[i] = Point2f( static_cast<float>(mu[i].m10/mu[i].m00), static_cast<float>(mu[i].m01/mu[i].m00 )); // 【10】二维坐标转换  printf("\t(X%d , Y%d)= (%7.3f , %7.3f)\t    P%d = %4.3f\n",i+1,i+1,coord_X(mc[i].x),coord_Y(mc[i].y),i+1,P_call(mc[i].x,mc[i].y) );P[i] = P_call( mc[i].x , mc[i].y ) ;}// 【11】绘制轮廓 drawing = Mat::zeros( out.size(), CV_8UC3 );for( unsigned int i = 0; i< g_vContours.size(); i++ ){Scalar color = Scalar(rand()&255 , rand()&255 ,rand()&255 );//随机生成颜色值drawContours( drawing, g_vContours, i , color, 2, 8, g_vHierarchy, 0, Point() );//绘制外层轮廓//颜色,线宽,线型,轮廓结构信息circle( drawing, mc[i] , 3 , color, -1, 8, 0 );;//绘制圆}// 【12】通过OpenCV计算轮廓面积并且和OpenCV函数比较printf("\n > 计算出轮廓的面积S:\t\t 计算出不精确立体角Ω: \n");for(unsigned  int i = 0; i< g_vContours.size(); i++ ){float S = (float)contourArea(g_vContours[i]) ;float w = w_call(coord_X(mc[i].x) , coord_Y(mc[i].y) , S );wl[i] = w_call(coord_X(mc[i].x) , coord_Y(mc[i].y) , S );printf(" \tS_%d = %.2f\t\t    Ω_%d = %.9f \t\n" ,i+1 ,contourArea(g_vContours[i]),i+1 , w );}}

运行结果:




0 0