OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。轮廓周围绘制介绍没什么
千家信息网最后更新 2025年02月23日OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么
OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
轮廓周围绘制介绍
没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像:
相关API
减少多边形轮廓点数:approxPolyDP
函数作用:基于RDP算法实现,目的是减少多边形轮廓点数
函数原型:
//减少多边形轮廓点数approxPolyDP( InputArray curve, // 一般是由图像的轮廓点组成的点集 Mat(vector) OutputArray approxCurve, // 表示输出的多边形点集 double epsilon, // 主要表示输出的精度,就是两个轮廓点之间最大距离数,5,6,7,,8,,,, bool closed // 表示输出的多边形是否封闭)
RDP算法介绍:
判断起始点(当前点)与终点的距离是否小于 epsilon, 若小于,结束,不小于执行2
选取起始点(当前点)A的后两个位置的点C,判断它们之间的距离是否小于 epsilon, 若小于,点C与它们的中间点B都舍弃,若不小于,执行3
判断A与B,B与C的距离,若有一者小于 epsilon,则点B舍弃,否则保留。然后点C作为起始点(当前点)重复 1 2 3 步骤,直到终点(这里得出的是一系列符合要求的点)
轮廓周围绘制矩形:boundingRect、minAreaRect
cv::boundingRect(InputArray points) 得到轮廓周围最小矩形左上交点坐标和右下角点坐标,绘制一个矩形
cv::minAreaRect(InputArray points) 得到一个旋转的矩形,返回旋转矩形
轮廓周围绘制圆和椭圆:minEnclosingCircle、fitEllipse
// 得到轮廓周围最小椭圆cv::minEnclosingCircle(InputArray points, // 得到最小区域圆形Point2f& center, // 圆心位置 输出参数float& radius // 圆的半径 输出参数)// 得到轮廓周围最小椭圆cv::fitEllipse(InputArray points)
绘制步骤
将图像变为二值图像
发现轮廓,找到图像轮廓
通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形与椭圆
绘制周围
代码示例
#include#include #include #include #include using namespace std;using namespace cv;Mat src, gray_src, drawImg;int threshold_v = 170;int threshold_max = 255;const char* output_win = "rectangle-demo";RNG rng(12345);void Contours_Callback(int, void*);int main(int argc, char** argv) { src = imread("./test2.jpg"); if (!src.data) { printf("could not load image...\n"); return -1; } cvtColor(src, gray_src, CV_BGR2GRAY); blur(gray_src, gray_src, Size(3, 3), Point(-1, -1)); const char* source_win = "input image"; namedWindow(source_win, CV_WINDOW_AUTOSIZE); namedWindow(output_win, CV_WINDOW_AUTOSIZE); imshow(source_win, src); createTrackbar("Threshold Value:", output_win, &threshold_v, threshold_max, Contours_Callback); Contours_Callback(0, 0); waitKey(0); return 0;}void Contours_Callback(int, void*) { Mat binary_output; vector > contours; vector hierachy; threshold(gray_src, binary_output, threshold_v, threshold_max, THRESH_BINARY); imshow("binary image", binary_output); findContours(binary_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1)); vector > contours_ploy(contours.size()); vector ploy_rects(contours.size()); vector ccs(contours.size()); vector radius(contours.size()); vector minRects(contours.size()); vector myellipse(contours.size()); for (size_t i = 0; i < contours.size(); i++) { approxPolyDP(Mat(contours[i]), contours_ploy[i], 3, true); ploy_rects[i] = boundingRect(contours_ploy[i]); minEnclosingCircle(contours_ploy[i], ccs[i], radius[i]); if (contours_ploy[i].size() > 5) { myellipse[i] = fitEllipse(contours_ploy[i]); minRects[i] = minAreaRect(contours_ploy[i]); } // draw it drawImg = Mat::zeros(src.size(), src.type()); Point2f pts[4]; for (size_t t = 0; t < contours.size(); t++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); //rectangle(drawImg, ploy_rects[t], color, 2, 8); //circle(drawImg, ccs[t], radius[t], color, 2, 8); if (contours_ploy[t].size() > 5) { ellipse(drawImg, myellipse[t], color, 1, 8); minRects[t].points(pts); for (int r = 0; r < 4; r++) { line(drawImg, pts[r], pts[(r + 1) % 4], color, 1, 8); } imshow(output_win, drawImg); return;
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
轮廓
矩形
最小
图像
多边形
输出
椭圆
前点
点数
起始
圆形
两个
之间
位置
函数
参数
坐标
就是
步骤
算法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
迷你世界国际服最好玩的服务器
怎么修改数据库文件地址
南航金城教务网数据库
linux关掉服务器防火墙
亚信安全数字安全网络安全
在一个数据库中有个概念模式
海陵区小型网络技术参考价格
华视美达服务器可以用吗
长宁区推广网络技术备案
新洲计算机软件开发条件
北京定制网络技术咨询项目
数据库开发实例和应用
商务直播软件开发
我的世界服务器纯生存端游
软件开发ssh
火绒重置安全服务器时出现问题
成都大图网络技术怎么样
中国新的软件开发公司
哈工大网络安全知乎
dell服务器远程装系统
5g网络技术的来龙去脉
mysql数据库导入出错
数据库怎么判断bug
提高网络安全防止电信诈骗
数据库工程师招聘要求
重庆邮电网络安全专业排名
北仑嵌入式软件开发商
pc端mc服务器价格
2021国家网络安全周通讯报道
软件开发产品部经理工作职责