时间:2021-05-19
本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下
前言
1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现。
2.我这里使用的OpenCV版本是3.30.
矩形检测
1.得到原始图像之后,代码处理的步骤是:
(1)滤波增强边缘。
(2)分离图像通道,并检测边缘。
(3) 提取轮廓。
(4)使用图像轮廓点进行多边形拟合。
(5)计算轮廓面积并得到矩形4个顶点。
(6)求轮廓边缘之间角度的最大余弦。
(7)画出矩形。
2.代码
//检测矩形//第一个参数是传入的原始图像,第二是输出的图像。void findSquares(const Mat& image,Mat &out){ int thresh = 50, N = 5; vector<vector<Point> > squares; squares.clear(); Mat src,dst, gray_one, gray; src = image.clone(); out = image.clone(); gray_one = Mat(src.size(), CV_8U); //滤波增强边缘检测 medianBlur(src, dst, 9); //bilateralFilter(src, dst, 25, 25 * 2, 35); vector<vector<Point> > contours; vector<Vec4i> hierarchy; //在图像的每个颜色通道中查找矩形 for (int c = 0; c < image.channels(); c++) { int ch[] = { c, 0 }; //通道分离 mixChannels(&dst, 1, &gray_one, 1, ch, 1); // 尝试几个阈值 for (int l = 0; l < N; l++) { // 用canny()提取边缘 if (l == 0) { //检测边缘 Canny(gray_one, gray, 5, thresh, 5); //膨脹 dilate(gray, gray, Mat(), Point(-1, -1)); imshow("dilate", gray); } else { gray = gray_one >= (l + 1) * 255 / N; } // 轮廓查找 //findContours(gray, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE); findContours(gray, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); vector<Point> approx; // 检测所找到的轮廓 for (size_t i = 0; i < contours.size(); i++) { //使用图像轮廓点进行多边形拟合 approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true); //计算轮廓面积后,得到矩形4个顶点 if (approx.size() == 4 &&fabs(contourArea(Mat(approx))) > 1000 &&isContourConvex(Mat(approx))) { double maxCosine = 0; for (int j = 2; j < 5; j++) { // 求轮廓边缘之间角度的最大余弦 double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1])); maxCosine = MAX(maxCosine, cosine); } if (maxCosine < 0.3) { squares.push_back(approx); } } } } } for (size_t i = 0; i < squares.size(); i++) { const Point* p = &squares[i][0]; int n = (int)squares[i].size(); if (p->x > 3 && p->y > 3) { polylines(out, &p, &n, 1, true, Scalar(0, 255, 0), 3, LINE_AA); } } imshow("dst",out);}static double angle(Point pt1, Point pt2, Point pt0){ double dx1 = pt1.x - pt0.x; double dy1 = pt1.y - pt0.y; double dx2 = pt2.x - pt0.x; double dy2 = pt2.y - pt0.y; return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);}3.运行结果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
OpenCV中circle与rectangle函数显示,只不过rectangle在图像中画矩形,circle在图像中画圆。voidcircle(Matimg,P
如下所示:运行环境:python3.6.4opencv3.4.0#-*-coding:utf-8-*-"""Note:使用Python和OpenCV检测图像中的
本文实例为大家分享了OpenCV鼠标绘制截取矩形区域图像的具体代码,供大家参考,具体内容如下在opencv中利用鼠标绘制矩形,代码如下:#include#inc
前言本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形。准备工作首先创建一个Wpf项目——WpfOpenCV,这里版本使用Framework4.7.2。然后
本文实例为大家分享了Opencv实现最小外接矩形和圆的具体代码,供大家参考,具体内容如下步骤:将一幅图像先转灰度,再canny边缘检测得到二值化边缘图像,再寻找