#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv; void find_centrepoint(Mat image, Point &centrepoint, RotatedRect &max_Rect)
{ Mat element = getStructuringElement(MORPH_ELLIPSE, Size(, ));
morphologyEx(image, image, MORPH_OPEN, element);
morphologyEx(image, image, MORPH_CLOSE, element);
Mat cannyImage;
Canny(image, cannyImage, , , );
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(cannyImage, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); //vector<vector<Point> > contours_poly(contours.size());
vector<RotatedRect> boundRect(contours.size()); for (size_t i = ; i < contours.size(); i++)
{
//approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
boundRect[i] = minAreaRect(Mat(contours[i]));
} vector<Point> max_contour;
int area = ;
int idx;
for (size_t i = ; i < contours.size(); i++)
{ int t_area = boundRect[i].size.area();
if (t_area>area)
{
max_contour = contours[i];
max_Rect = boundRect[i];
area = t_area;
idx = i;
}
}
centrepoint.x = max_Rect.center.x;
centrepoint.y = max_Rect.center.y;
Point2f P[];
max_Rect.points(P);
for (int j = ; j <= ; j++)
{
line(image, P[j], P[(j + ) % ], Scalar(), );
}
//rectangle(image, max_Rect.tl(), max_Rect.br(), Scalar(255), 4);
//drawContours(image, contours, idx, Scalar(255), 2, 8);
}
int main(int args, char** argv)
{
Mat srcImage = imread("D:\\Documents\\BasedCam2 Files\\Picture\\贴膜机\\镜头2\\2018-03-07_15-47-48_030.bmp");
if (!srcImage.data)
{
cout << "读取图像失败" << endl;
return -;
}
cvtColor(srcImage, srcImage, CV_BGR2GRAY);
namedWindow("原图像", );
resizeWindow("原图像", srcImage.cols / , srcImage.rows / );
imshow("原图像", srcImage); Mat T = Mat(srcImage.size(), srcImage.type());
adaptiveThreshold(srcImage, T, , ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, , ); Point centrePoint1;
RotatedRect max_Rect1;
find_centrepoint(T, centrePoint1, max_Rect1); Mat medImage;
medianBlur(srcImage, medImage, );
Mat binaryImage;
threshold(medImage, binaryImage, , , THRESH_BINARY);
Point centrePoint2;
RotatedRect max_Rect2;
find_centrepoint(binaryImage, centrePoint2, max_Rect2); namedWindow("圆外接矩形", );
resizeWindow("圆外接矩形", srcImage.cols / , srcImage.rows / );
imshow("圆外接矩形", T);
namedWindow("膜接矩形", );
resizeWindow("膜接矩形", srcImage.cols / , srcImage.rows / );
imshow("膜接矩形", binaryImage); waitKey();
return ; }
//Mat midImage, dstImage;
//double fScale = 0.5;
//Size dsize = Size(srcImage.cols*fScale, srcImage.rows*fScale);
//resize(srcImage, srcImage,dsize);
////imshow("【原始图】", srcImage); //cvtColor(srcImage, midImage, CV_BGR2GRAY);//转化边缘检测后的图为灰度图
////medianBlur(midImage, midImage, 9);
////bilateralFilter(midImage, midImage, 5, 10,10);
//imshow("【原始图】", midImage);
//vector<Vec3f> circles;
//HoughCircles(midImage, circles, CV_HOUGH_GRADIENT, 1, 50, 100, 50, 200, 0);
////依次在图中绘制出圆
//for (size_t i = 0; i < circles.size(); i++)
//{
// Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
// int radius = cvRound(circles[i][2]);
// //绘制圆心
// circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
// //绘制圆轮廓
// circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
//} //for (size_t i = 0; i< contours.size(); i++)
//{
// // drawContours(drawing, contours_poly, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point());
// rectangle(T, boundRect[i].tl(), boundRect[i].br(), Scalar(255), 4, 8, 0);
// // circle(drawing, center[i], (int)radius[i], color, 2, 8, 0);
// printf("%d - (%d,%d),(%d,%d)\n", i, boundRect[i].x, boundRect[i].y, boundRect[i].width, boundRect[i].height);
//}
//for (size_t i = 0; i < contours.size(); i++)
//{
// drawContours(T, contours, i, Scalar(255), 1, 8);
//} //for (int i = 0; i < srcImage.rows; ++i)
// {
// for (int j = 0; j < srcImage.cols; ++j)
// {
// if (srcImage.at<uchar>(i, j) <= meanImage.at<uchar>(i, j) - 5)
// {
// T.at<uchar>(i, j) = 255;
// }
// else
// {
// T.at<uchar>(i, j) = 0;
// }
// }
// }

OpenCV代码:画出轮廓的外接矩形,和中心点的更多相关文章

  1. 第15.30节 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint消息画出scrollAreaWidgetContents的范围矩形

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在<PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解> ...

  2. opencv画出轮廓外接矩形

    Mat cannyImage; /// Detect edges using canny Canny(src, cannyImage, , , ); vector<vector<Point ...

  3. 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

    FindContours 在二值图像中寻找轮廓  int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_cont ...

  4. 20行以内python代码画出各种减压图

    一.太阳花 看到一个很有意思的代码,你若安好,便是晴天!太阳花向你开~ 绘画效果如下: 代码如下: from turtle import * color('red', 'yellow') begin_ ...

  5. Opencv 最小外接矩形合并拼接

    前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的 如图1是一个信号的雨图,被矩形框分割成了多个小框: 需要合并矩形框达到的效果: 主要思想: 扫描两 ...

  6. opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

    一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...

  7. opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

    一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...

  8. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  9. 【4Opencv】如何识别出轮廓准确的长和宽

    问题来源: 实际项目中,需要给出识别轮廓的长度和宽度. 初步分析: 轮廓分析的例程为: int main( int argc, char** argv ){    //read the image  ...

随机推荐

  1. c#的默认访问权限

    1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员. internal : 同一程序集中的任何代码都可以访问该类型或成员, ...

  2. 1--Postman使用token进行批量测试

    1. 先执行登陆接口,查看返回token是再响应头还是再响应体 有的返回再响应头中,有的再响应体中 2.设置环境变量token,并从登陆接口获取token赋值给环江变量 第一步:创建环境变量,值为空即 ...

  3. MySql之左连接,右连接

    左连接,右连接查询的表 中 on后面的条件不会影响主表的数据,只会影响右表的数据. 例: 没加条件的时候 左表加条件: 右表加条件: 通过上面3处对比可以看出来,用LEFT JOIN 的时候不管对左表 ...

  4. python装饰器的详细解析

    什么是装饰器? python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于 ...

  5. PHP发送POST请求

    方式一:cURL $url = "localhost/test/post/service.php"; $data = array("a"=>"网 ...

  6. 记录 spf13-vim 遇到的问题

    一.spf13-vim 常用快捷键: https://blog.csdn.net/BjarneCpp/article/details/80608706 https://www.cnblogs.com/ ...

  7. C# ZipHelper C#公共类 -- ZipArchive实现压缩和解压

    从网上找来个ZipArchive来压缩和解压缩的类,供参考吧 /******************************************************************** ...

  8. 解决 windows下安装Anaconda后python pip不可用的情况

    在windows系统下通过安装Anaconda的方式安装的python使用中发现不能再通过pip安装python包.只能通过conda install packname 的方法,导致很多conda不支 ...

  9. 搭建自己的Docker registry(五)

    弄了一天,在网上查了很多资料,感觉都好复杂好复杂,一步一步踩坑踩出来就好了. 服务器:阿里云(香港) 环境:CentOS Linux release 7.4.1708 (Core) Docker:1. ...

  10. randrange()和random() 函数

    描述 randrange() 方法返回指定递增基数集合中的一个随机数,基数缺省值为1. 语法 以下是 randrange() 方法的语法: impot random random.randrange ...