OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。轮廓周围绘制介绍没什么
千家信息网最后更新 2025年01月16日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安全错误
数据库的锁怎样保障安全
wow常州服务器
怎么卸载服务器上的浏览器
数据库单引号是什么意思
双防护服务器是什么
山西电视台网络安全教育
万方数据库 维护
怎么样筛选不重复的数据库
为什么公司文件服务器连接不上
阿里巴巴数据库监控
部门网络安全自查总结报告
公司要有数据库吗
心理学网络技术
网络安全等级保护年度考核
电子城科技大厦 互联网公司
服务器的视频
联佰DICOM打印服务器软件
校园网络安全教育感想
若依部署到服务器后不能增删
ubuntu 链接数据库
网络安全组网流量分析
惠普服务器 388
云南互联网养老软件开发
工业互联网最新科技股票
金蝶数据库安装图
现在公务员招软件开发吗
文献传递的数据库
数据库连接数php
苹果4附件尚未从服务器下载
sty服务器
移动技术包括网络技术吗