
#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 ¢repoint, 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;
// }
// }
// }