#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#获取程序运行时间

    需要用到System.Diagnostics名称空间中的Stopwatch类! Stopwatch类其中有一个属性ElapsedMilliseconds.该属性是获取当前运行时间,以毫秒为单位! 其中 ...

  2. ChinaCock界面控件介绍-TCCBarcodeCreator

    条码生成器,可以生成各种条码,包括二维码.这是一个不可视控件.用起来依旧简单. 属性说明: BarCodeColor:生成条码的颜色 BarcodeFormat:生成条码的类型,支持的条码类型: Bo ...

  3. java 几种对象

     POJO(plain old java object):普通的java对象,有别于特殊的java对象(含继承约束等)和EJB.POJO一般只有一系列的属性和相应的get.set方法.     PO( ...

  4. format 插入一个字符,%d,%n

  5. 蓝牙协议分析(8)_BLE安全机制之白名单

    1. 前言 在万物联网的时代,安全问题将会受到非常严峻的挑战(相应地,也会获得最大的关注度),因为我们身边的每一个IOT设备,都是一个处于封印状态的天眼,随时都有被开启的危险.想想下面的场景吧: 凌晨 ...

  6. Erlang-接口技术

    系统的构建一定会设计到简历接口,让他与不同的语言的应用程序之间简历系统的联系.这就叫做erlang的接口技术. 接口技术的三种实现方法: 1.让程序以外部操作系统进行的形式在Erlang虚拟机以外运行 ...

  7. 【转载】 Deepmind星际争霸2平台使用第一轮-完成采矿

    原文地址: https://blog.csdn.net/woaipichuli/article/details/78645999 ----------------------------------- ...

  8. php之异常处理

    <?php declare(strict_types = 1); function demo(int $v):int{ return 1; } try{ demo("1"); ...

  9. CSVN配置自动备份策略

    在浏览器中登录CSVN管理页面,登录地址就是ip:3343,版本库->backup schedule ,选择type of job(备份类型),when to run(备份频率和时间),numb ...

  10. Linux-入门配置jdk,tomcat,mysql

    Mysql安装 大家可以在这里下 http://mirrors.163.com/mysql/Downloads/MySQL-5.7/ 1)查看CentOS自带的mysql rpm -qa | grep ...