#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. 文本分类TextCNN

    参考来源:https://blog.csdn.net/u012762419/article/details/79561441 TextCNN结构 TextCNN的结构比较简单,输入数据首先通过一个em ...

  2. MFC VC++获取当前程序的运行路径

    ]; GetModuleFileName(, szDir, ); int i; i = lstrlen(szDir) - ; ) { if(szDir[i] == _T('\\')) { szDir[ ...

  3. case语法

    一.文件系统访问列表 FACL :Filesystem Access Control List    文件系统访问列表 利用文件扩展保存额外的访问控制权限. setfacl: -m:设定访问控制权限  ...

  4. WKWebView 加载本地HTML随笔

    一天的时间 解决两个坑~~ 1.加载不出来本地HTML 的JS  CSS 样式,问题是引用到项目中 是用的group 这个是错的 直接上图 就知道了 像上图一样,加入相对路径即可,因为如果使用了gro ...

  5. MySQL设置空密码

    因为刚安装的时候,MySQL强制设置密码,但是我需要设置MySQL为空密码 语句: ';

  6. centos7 ssh连接慢

    指的是连接到centos7,输入密码后要等很久才会返回.之前很多人遇到的问题都是由于/etc/ssh/sshd_config的UseDNS配置项和GSSAPIAuthentication配置项引起的, ...

  7. 集群相关、用keepalived配置高可用集群

    1.集群相关 2.keepalived相关 3.用keepalived配置高可用集群 安装:yum install keepalived -y   高可用,主要是针对于服务器硬件或服务器上的应用服务而 ...

  8. 查看Linux磁盘空间

    df -hl 查看磁盘剩余空间 df -h 查看每个根路径的分区大小 du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文件夹总M数 du -h [目录名] 查看指定文件夹下 ...

  9. 【python接口自动化框架-unittest】如何传参数到下一个case

    1.前提 平时我们用unittest的时候,都知道每个test_ 都是相互独立的,但是很多现实情况是,我们下一个接口参数,可能会用到上一个接口返回的json字段,那么,我们怎么去实现呢 2.实例 1. ...

  10. jenkins 结合 jmeter 的报告篇

    背景:实现jmeter每30分钟执行一次,运行系统中所有接口或者性能脚本或者后续更可以由系统部署来触发建构执行 1.配置jmeter测试环境,注意修改Jmeter的bin目录下jmeter.prope ...