栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OpenCV入门系列 —— cv::approxPolyDP 计算包围框

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCV入门系列 —— cv::approxPolyDP 计算包围框

OpenCV入门系列 —— cv::approxPolyDP 计算包围框
    • 前言
    • 程序说明
    • 输出结果
    • 代码示例


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析、场景数据分析、基础算法模块、相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。


程序说明

提取图像物体边缘并生成最小包围框;

输出结果

代码示例
#include 
#include 
#include 




#define WINDOW_NAME1 "【原始图窗口】"        //为窗口标题定义的宏 
#define WINDOW_NAME2 "【效果图窗口】"        //为窗口标题定义的宏 

cv::Mat g_srcImage;
cv::Mat g_grayImage;
int g_nThresh = 50;//阈值
int g_nMaxThresh = 255;//阈值最大值
cv::RNG g_rng(12345);//随机数生成器


void on_ContoursChange(int, void* );


int main(int argc, char** argv)
{
	if(argc != 2){
        std::cout<<"Usage: exec img_file_path"<
	//定义一些参数
	cv::Mat threshold_output;
	std::vector> contours;
	std::vector hierarchy;

	// 使用Threshold检测边缘
	cv::threshold( g_grayImage, threshold_output, 
			g_nThresh, 255, cv::THRESH_BINARY );

	// 找出轮廓
	cv::findContours( threshold_output, contours, hierarchy, 
		cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

	// 多边形逼近轮廓 + 获取矩形和圆形边界框
	std::vector > contours_poly( contours.size() );
	std::vector boundRect( contours.size() );
	std::vectorcenter( contours.size() );
	std::vectorradius( contours.size() );

	// 一个循环,遍历所有部分,进行本程序最核心的操作
	for( unsigned int i = 0; i < contours.size(); i++ )
	{ 
		//用指定精度逼近多边形曲线
		cv::approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true ); 
		//计算点集的最外面(up-right)矩形边界
		boundRect[i] = cv::boundingRect( cv::Mat(contours_poly[i]) );
		//对给定的 2D点集,寻找最小面积的包围圆形
		cv::minEnclosingCircle( contours_poly[i], center[i], radius[i] ); 
	}

	// 绘制多边形轮廓 + 包围的矩形框 + 圆形框
	cv::Mat drawing = cv::Mat::zeros( threshold_output.size(), CV_8UC3 );
	for( int unsigned i = 0; i
		//随机设置颜色
		cv::Scalar color = cv::Scalar( g_rng.uniform(0, 255), 
					g_rng.uniform(0,255), g_rng.uniform(0,255) );
		//绘制轮廓
		cv::drawContours( drawing, contours_poly, i, color, 
				1, 8, std::vector(), 0, cv::Point() );
		//绘制矩形
		cv::rectangle(drawing,boundRect[i].tl(),boundRect[i].br(),color,2,8,0);
		cv::circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );//绘制圆
	}

	// 显示效果图窗口
	cv::namedWindow( WINDOW_NAME2, cv::WINDOW_AUTOSIZE );
	cv::imshow( WINDOW_NAME2, drawing );
}

注:部分测试所用图片数据来源于网络,如有侵权,请联系博主删除,谢谢。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971478.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号