#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void fillHole(const Mat srcBw, Mat &dstBw)
{
Size m_Size = srcBw.size();
Mat Temp = Mat::zeros(m_Size.height + 2, m_Size.width + 2, srcBw.type());
srcBw.copyTo(Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)));
cv::floodFill(Temp, Point(0, 0), Scalar(255));
Mat cutImg;
Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg);
dstBw = srcBw | (~cutImg);
}
int main()
{
Mat src = imread("rotImage.jpg");
if (!src.data)
{
printf("读取图片错误! \n");
return false;
}
imshow("原图像", src);
Mat src1 = src.clone();
Mat dst, gray, edge;
dst.create(src1.size(), src1.type());
cvtColor(src1, gray, COLOR_BGR2GRAY);
blur(gray, edge, Size(3, 3));
Mat bw;
cv::threshold(edge, bw, 120, 250, 0);
Mat bwFill;
fillHole(bw, bwFill);
imshow("二值化处理后的图像", bwFill);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(bwFill, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
vector<Moments> mu(contours.size());
for (unsigned int i = 0; i < contours.size(); i++)
{
mu[i] = moments(contours[i], false);
}
vector<Point2f> mc(contours.size());
for (unsigned int i = 0; i < contours.size(); i++)
{
mc[i] = Point2f(static_cast<float>(mu[i].m10 / mu[i].m00), static_cast<float>(mu[i].m01 / mu[i].m00));
}
Mat drawing = Mat::zeros(bwFill.size(), CV_8UC3);
RNG g_rng(12345);
for (unsigned int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
circle(drawing, mc[i], 4, color, -1, 8, 0);
}
RotatedRect box;
Point2f vertex[4];
for (unsigned int i = 0; i < contours.size(); i++)
{
box = minAreaRect(Mat(contours[i]));
box.points(vertex);
for (int i = 0; i < 4; i++)
line(drawing, vertex[i], vertex[(i + 1) % 4], Scalar(100, 200, 211), 2, CV_AA);
}
imshow("绘制的矩形框", drawing);
cout <<"需要校正的角度为:"<< box.angle;
Mat rotMat, rotateImage;
rotMat = getRotationMatrix2D(box.center, box.angle,1);
warpAffine(src, rotateImage, rotMat, src.size());
imshow("校正后的图像", rotateImage);
waitKey(0);
return 0;
}