OpenCV入门系列 —— cv::minAreaRect 随机生成点坐标并计算最小包围矩形

OpenCV入门系列 —— cv::minAreaRect 随机生成点坐标并计算最小包围矩形


前言

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

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

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

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

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

在这里插入图片描述


程序说明

随机生成点坐标数据,并计算最小包围矩形;

输出结果

在这里插入图片描述

代码示例

/*
 * @File: min_area_rect.cpp
 * @Brief: opencv course
 * @Description: 展示最小包围矩形的效果
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>




int main(int argc, char** argv){
    
    

	//初始化变量和随机值
	cv::Mat image(600, 600, CV_8UC3);
	cv::RNG& rng = cv::theRNG();

	//循环,按下ESC,Q,q键程序退出,否则有键按下便一直更新
	while(1)
	{
    
    
		//参数初始化
		char key;//键值
		int count = (unsigned)rng%100 + 3;//随机生成点的数量
		std::vector<cv::Point> points; //点值

		//随机生成点坐标
		for(int i = 0; i < count; i++ )
		{
    
    
			cv::Point point;
			point.x = rng.uniform(image.cols/4, image.cols*3/4);
			point.y = rng.uniform(image.rows/4, image.rows*3/4);

			points.push_back(point);
		}

		//对给定的 2D 点集,寻找最小面积的包围矩形
		cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));
		cv::Point2f vertex[4];
		box.points(vertex);

		//绘制出随机颜色的点
		image = cv::Scalar::all(0);
		for(int i = 0; i < count; i++ ){
    
    
			cv::circle(image, points[i], 3, 
				cv::Scalar(rng.uniform(0,255),rng.uniform(0,255),
				rng.uniform(0,255)), cv::FILLED, cv::LINE_AA);
		}

		//绘制出最小面积的包围矩形
		for( int i = 0; i < 4; i++ ){
    
    
			cv::line(image, vertex[i], vertex[(i+1)%4], 
				cv::Scalar(100, 200, 211), 2, cv::LINE_AA);
		}

		//显示效果图
		cv::imshow("最小包围矩形检测示例", image);

		//按下ESC,Q,或者q,程序退出
		key = (char)cv::waitKey();
		if( key == 27 || key == 'q' || key == 'Q' ) 
			break;
	}

    return 0;
}

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

猜你喜欢

转载自blog.csdn.net/memorynode/article/details/125240212