#include
#include
#include
using namespace cv;
int main()
{
Mat srcImage = imread("1.png");
imshow("【原始图像】", srcImage);
cvtColor(srcImage, srcImage, CV_BGR2GRAY);
threshold(srcImage, srcImage, 0, 255, THRESH_OTSU);
imshow("【二值化图像】", srcImage);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
Mat contoursImage(srcImage.rows, srcImage.cols, CV_8U, Scalar(0));
if (!contours.empty() && !hierarchy.empty())
{
for (int i = 0; i< contours.size(); i++)
{
drawContours(contoursImage, contours, i, Scalar(255), 1, 8, hierarchy);
}
}
imshow("边缘图像", contoursImage);
Mat resultImage(srcImage.rows, srcImage.cols, CV_8UC3, Scalar(0));
for (int i = 0; i < contours.size(); i++)
{
//寻找最小包围圆形
Point2f center; //圆心
float radius; //半径
minEnclosingCircle(contours[i], center, radius);
//由minEnclosingCircle函数得到的圆形和半径来绘制最小外接圆
circle(resultImage, center, radius, Scalar((rand() & 255), (rand() & 255), (rand() & 255)), 3);
}
imshow("【最小包围圆】", resultImage);
waitKey(0);
return 0;
}
#include
#include
#include
using namespace cv;
int main()
{
Mat srcImage = imread("1.png");
imshow("【原始图像】", srcImage);
cvtColor(srcImage, srcImage, CV_BGR2GRAY);
threshold(srcImage, srcImage, 0, 255, THRESH_OTSU);
imshow("【二值化图像】", srcImage);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
Mat contoursImage(srcImage.rows, srcImage.cols, CV_8U, Scalar(0));
if (!contours.empty() && !hierarchy.empty())
{
for (int i = 0; i< contours.size(); i++)
{
drawContours(contoursImage, contours, i, Scalar(255), 1, 8, hierarchy);
}
}
imshow("边缘图像", contoursImage);
Mat resultImage(srcImage.rows, srcImage.cols, CV_8UC3, Scalar(0));
for (int i = 0; i < contours.size(); i++)
{
//寻找外包矩形
Rect maxRect = boundingRect(contours[i]);
//绘制外包矩形
rectangle(resultImage, maxRect, Scalar((rand() & 255), (rand() & 255), (rand() & 255)));
}
imshow("【外接矩形】", resultImage);
waitKey(0);
return 0;
}
#include
#include
#include
using namespace cv;
int main()
{
Mat srcImage = imread("1.png");
imshow("【原始图像】", srcImage);
cvtColor(srcImage, srcImage, CV_BGR2GRAY);
threshold(srcImage, srcImage, 0, 255, THRESH_OTSU);
imshow("【二值化图像】", srcImage);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
Mat contoursImage(srcImage.rows, srcImage.cols, CV_8U, Scalar(0));
if (!contours.empty() && !hierarchy.empty())
{
for (int i = 0; i< contours.size(); i++)
{
drawContours(contoursImage, contours, i, Scalar(255), 1, 8, hierarchy);
}
}
imshow("边缘图像", contoursImage);
Mat resultImage(srcImage.rows, srcImage.cols, CV_8UC3, Scalar(0));
for (int i = 0; i < contours.size(); i++)
{
//寻找最小外接矩形
RotatedRect minRect = minAreaRect(contours[i]);
Point2f fourPoints[4];
//将minRect对象的四个顶点坐标值放到fourPoints数组中
minRect.points(fourPoints);
//根据得到的四个点的坐标 绘制矩形
for (int i = 0; i < 3; i++)
{
line(resultImage, fourPoints[i], fourPoints[i + 1], Scalar(0, 255, 0), 3);
}
line(resultImage, fourPoints[0], fourPoints[3], Scalar(0, 255, 0), 3);
}
imshow("【最小外接矩形】", resultImage);
waitKey(0);
return 0;
}
在opencv中,坐标的原点在左上角,与x轴平行的方向为角度为0,逆时针旋转角度为负,顺时针旋转角度为正。而RotatedRect类是以矩形的哪一条边与x轴的夹角作为角度的呢?angle 是水平轴(x轴)逆时针旋转,与碰到的第一个边的夹角,而opencv默认把这个边的边长作为width,angle的取值范围必然是负的