OpenCV笔记第二天:关于MFC中OpenCV使用cvFindContours引起的中断错误

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值