分享

(一)OpenCV图像处理基础

 猎狐肥 2021-05-27
  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

    0条评论

    发表

    请遵守用户 评论公约