OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么
发表于:2024-11-16 作者:千家信息网编辑
千家信息网最后更新 2024年11月16日,OpenCV 轮廓周围绘制矩形框和圆形框的方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。轮廓周围绘制介绍没什么
千家信息网最后更新 2024年11月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安全错误
数据库的锁怎样保障安全
阜阳电信软件开发
为什么会连接不到r星的服务器
tob业务系统数据库如何选择
java数据库啥意思
服务器安全服务
tis是哪三个服务器
计算机网络技术导论重点
世界船舶数据库
ncode材料数据库
服务器电气管理系统
维护服务器安全吗
计算机等级网络技术打分
关于青少年网络安全建议
天天美剧软件开发
数据库中可以保存什么
西安网络安全产业
数据库查询的优化技术
惠普服务器可以加阵列卡吗
网络安全产品经理就业面
网络安全受什么因素影响
浅析计算机信息网络安全
什么是tpg软件开发
网络安全公司受益吗
河南软件开发哪个牌子质量好
哈尔滨理工大学数据库
为什么那么多人从事软件开发
莱州实验小学开展网络安全宣传
那家服务器好
as是哪里的服务器
区块链钱包专业软件开发