(一)OpenCV图像处理基础

  1. 轮廓周围绘制矩形框和圆形框
  2. 轮廓周围绘制多边形
approxPolyDP(InputArray  curve, OutputArray approxCurve,  double  epsilon,  bool  closed)
  1. 轮廓周围绘制矩形
cv::boundingRect(InputArray points)得到轮廓周围最小矩形左上交点坐标和右下角点坐标,绘制一个矩形
cv::minAreaRect(InputArray  points)得到一个旋转的矩形,返回旋转矩形
  1. 轮廓周围绘制圆和椭圆
cv::minEnclosingCircle(
InputArray points, //得到最小区域圆形
Point2f& center, // 圆心位置
float& radius)// 圆的半径
  1. 得到最小椭圆
cv::fitEllipse(InputArray  points)
  1. 步骤
    ①首先将图像变为二值图像;
    ②发现轮廓,找到图像轮廓;
    ③通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形与椭圆;
    ④绘制
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat src, gray, temp, dst;
RNG rng;

int value = 128;//低阈值
void Trackbar_Callback(int, void*);

int main(int argc, char** argv)
{
src = imread("../path.jpg");
if (src.empty())
{
cout << "could not load image1..." << endl;
return -1;
}

namedWindow("src", WINDOW_AUTOSIZE);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("src", src);

cvtColor(src, gray, COLOR_BGR2GRAY);//转换为灰度图
GaussianBlur(gray , gray, Size(3, 3), 11, 0);//高斯平滑

createTrackbar("Trackbar", "dst", &value, 255, Trackbar_Callback);
Trackbar_Callback(0, 0);

waitKey(0);
return 0;
}

void Trackbar_Callback(int, void*)
{
threshold(gray, temp, value, 255, THRESH_BINARY);//二值化
vector<vector<Point>> contours;//定义轮廓
vector<Vec4i> hierachy;//定义轮廓数

findContours(temp, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1));//查找轮廓

vector<vector<Point>>contours_ploy(contours.size());//定义多边形数组(初始化大小)
vector<Rect>ploy_rects(contours.size());//矩形(初始化大小)
vector<Point2f>circlecenter(contours.size());//圆心(初始化大小)
vector<float>radius(contours.size());//圆半径(初始化大小)

vector<RotatedRect>minRects(contours.size());//定义非轴对称(任何斜度)矩形
vector<RotatedRect>myellipse(contours.size());//定义非轴对称(任何斜度)椭圆

for (size_t i = 0; i < contours.size(); i++)
{
//多边形逼近
approxPolyDP(Mat(contours[i]),//输入的轮廓
contours_ploy[i], //输出的轮廓
3,//逼近准确度
true);//true表示曲线闭合

ploy_rects[i] = boundingRect(contours_ploy[i]);//获得轮廓的矩形包围框

//获得最小包围圆
minEnclosingCircle(contours_ploy[i], //输入的轮廓
circlecenter[i],//输出的数组圆心
radius[i]);//输出的数组半径

if (contours_ploy[i].size() > 5)
{
minRects[i] = minAreaRect(contours_ploy[i]);//轮廓的最小矩形包围框
myellipse[i] = fitEllipse(contours_ploy[i]);//轮廓的最小椭圆包围框
}
}

//绘制(轮廓)图形
dst = Mat::zeros(src.size(), src.type());

Point2f pts[4];//包含四个点坐标

for (size_t j = 0; j < contours.size(); j++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机颜色
/*
//绘制矩形
rectangle(dst, //输入输出数组
ploy_rects[j],//矩形
color, 2, 8);
//绘制圆
circle(dst,//输入输出数组
circlecenter[j], //圆心
radius[j],//半径
color, 2, 8);
*/
if (contours_ploy[j].size() > 5)
{
ellipse(dst, myellipse[j], color, 1, 8);//绘制椭圆//轮廓的最小椭圆包围框
minRects[j].points(pts); //轮廓的最小矩形包围框
for (int k = 0; k < 4; k++)
{
line(dst, pts[k], pts[(k + 1) % 4], color, 1, 8);//绘制线
}
}
}
imshow("dst", dst);
return;
}

输出结果:

(0)

相关推荐

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • opencv笔记(二十九)——提取轮廓相关函数使用方法

    opencv中常用的跟轮廓相关的操作有:findContours()查找轮廓:drawContours()画轮廓:轮廓填充:计算轮廓的面积和周长:提取轮廓凸包,矩形,最小外接矩形,外接圆等.它们都有相 ...

  • 【从零学习OpenCV 4】轮廓发现与绘制

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【OpenCV读取标记点坐标】管道测速

    文章目录 一.项目简介 二.思考步骤 1. 图像二值化 2. 滤波去噪 3. Canny算法检测边缘 4. 查找轮廓并计算 5. 绘制轮廓并表示质心 三.测试结果 四.工程代码 一.项目简介 昨天一个 ...

  • 【从零学习OpenCV 4】轮廓外接多边形

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  • 图像特征之傅里叶描述子

    使用C++.opencv获取轮廓的傅里叶描述子 傅里叶描述子是一种图像特征,具体来说,是一个用来描述轮廓的特征参数.其基本思想是用物体边界信息的傅里叶变换作为形状特征,将轮廓特征从空间域变换到频域内, ...

  • 图像处理基础:颜色空间及其OpenCV实现

    重磅干货,第一时间送达 作者:Soumyadip Sarkar 编译:ronghuaiyang 转自:AI公园 导读 对图像的颜色空间做了一个概念性的介绍,并通过代码的方式可视化了每种颜色空间的每个通 ...

  • OpenCV图像处理教程C++(二十)轮廓发现、凸包、轮廓周围绘制圆和矩形

    轮廓发现–边缘 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓结果拓扑:就是把实体抽象成与其大小.形状无关的点,而把连接实体的线路抽象成"线&quo ...

  • (三)OpenCV图像处理

    直接 直接用霍夫直线检测,效果差; 通过图像形态学操作来寻找直线,霍夫获取位置信息与显示. #include <opencv2/opencv.hpp>#include <iostre ...

  • (1条消息) OpenCV图像处理实际案例(二)

    本博客算法及代码参考自贾志刚老师的<OpenCV图像处理-小案例实战>,若涉及侵权问题,望通知,会第一时间删除. 功能要求: 从如下图片中找出所有直线.  解决方案一: 直接进行霍夫直线检 ...

  • python+opencv图像处理(四十四)

    童年记忆中的爆米花,小时候只在过年的时候才能吃到,现在偶尔能在路边看到有在爆的,看到了总忍不住想买,虽然味道没什么变化,只是再吃不出来以前的幸福了. 长大了......心也大了...... 可是,实力 ...

  • python+opencv图像处理(四十三)

    Luplacian算子 1.Luplacian算子 可以用二阶导数可以用来检测边缘,拉普拉斯算子是线性二阶微分算子. 2.Luplacian算子实现 在 OpenCV 中, 可以用函数Laplacia ...

  • python+opencv图像处理(四十二)

    Kirsch算子 1.Kirsch算子 Kirsch算子是R.Kirsch提出来一种边缘检测新算法,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方 ...

  • python+opencv图像处理(四十一)

    提前过了个万圣节,南瓜灯还蛮好看的,就是那些装鬼的有点吓人...... Scharr算子 1.Scharr算子 Scharr算子也是用于提取图像边缘的. 它是对Sobel算子差异性的增强,两者的原理和 ...

  • python+opencv图像处理(四十)

    Sobel算子  开头来张帅哥...... ----------------------这是严谨的分割线-------------------------- 1.Sobel算子(索贝尔算子) Sobe ...