#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. man 命令帮助文件输出乱码

    man 命令重定向的时候有写控制字符再直接显示的时候没有问题, 但是重定向到文件中的时候,被解释错误,显示为 ^H 或者乱码 解决方法: man ps | col -b >a.txt 可以消除所 ...

  2. 实验楼 MySQL 基础课程 挑战:搭建一个简易的成绩管理系统的数据库

    传送门:https://www.shiyanlou.com/courses/running 介绍 现需要构建一个简易的成绩管理系统的数据库,来记录几门课程的学生成绩.数据库中有三张表分别用于记录学生信 ...

  3. 重启HA集群NameNode无缘无故挂掉

    重启HA集群后,两个NameNode无缘无故挂掉,查看日志时显示错误如下: 原因:journalnode的端口是8485,默认情况下是先NameNode启动后再启动journalnode,如果在Nam ...

  4. python中sys和os模块的使用

    在python中,sys,os模块是非常强大的,提供了许多对文件夹.文件和路径的操作方法 sys模块 sys.argv   #命令行执行脚本,其实它就是一个列表 ,sys.argv[0] 是程序自身路 ...

  5. 10.python面向对象进阶功能

    isinstance(obj,cls)和issubclass(sub,super)(1)isinstance(obj,cls)检查一个对象obj是否是一个类cls的实例(2)issubclass(su ...

  6. codeforces 804A Find Amir 思维/水题

    A few years ago Sajjad left his school and register to another one due to security reasons. Now he w ...

  7. robot framework下载文件操作

    不同的浏览器点击[下载]按钮之后,需要点击保存,还是确定,或者直接默认直接下载都是不一样的 1.chrome:点击[下载]之后,会自动执行下载操作,直到下载结束 A)点击下载,等待下载结束(sleep ...

  8. EBS打补丁参考

    EBS Application打补丁参考:http://blog.csdn.net/cunxiyuan108/article/details/6009784 整体步骤: 0. 停止应用(注意确认FND ...

  9. ehcache讲解及实例

    ehcache讲解及实例https://www.cnblogs.com/coprince/p/5984816.html 有些情形下注解式缓存是不起作用的:同一个bean内部方法调用,子类调用父类中有缓 ...

  10. 2.2 如何在Visio中写上、下角标

    快捷键:下标[“Ctrl”+ “=”] 上标[“Ctrl”+“shift”+“=”]