#include "stdafx.h"
#include
#include
#include
#include
int main()
{
cv::Mat original = cv::imread("../../aTestImage/cow.jpg", 1);
cv::Mat image = cv::imread("../../aTestImage/cow.jpg", 0);
if (!image.data) return 0;
cv::Mat binary;
cv::threshold(image, binary, 60, 255, CV_THRESH_BINARY_INV);//获取二值图像
cv::Mat element5(5, 5, CV_8U, cv::Scalar(255));//自定义结构元素5x5
cv::morphologyEx(binary, binary, cv::MORPH_CLOSE, element5);//闭运算
cv::morphologyEx(binary, binary, cv::MORPH_OPEN, element5);//开运算
std::vector contours;
//从经过开闭运算的二值图像中提取轮廓
cv::findContours(binary, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);//获取所有external轮廓
//画轮廓到白色背景图片上
cv::Mat result(image.size(), CV_8U, cv::Scalar(255));//定义8位纯白图片一张
cv::drawContours(result, contours, -1, cv::Scalar(0), 1);
cv::namedWindow("result");
cv::imshow("result", result);
//1.测试包围盒
cv::Rect r0 = cv::boundingRect(cv::Mat(contours[2]));//将第3个轮廓包围成矩形
cv::rectangle(result, r0, cv::Scalar(0), 2);//灰度0,线宽2
//2.测试最小包围圈
float radius;
cv::Point2f center;
cv::minEnclosingCircle(cv::Mat(contours[4]), center, radius);//将第5个轮廓包围成圆
cv::circle(result, cv::Point(center), static_cast(radius), cv::Scalar(0), 2);
//3.测试多边形
std::vector poly;
cv::approxPolyDP(cv::Mat(contours[5]), poly, 5, true);//将轮廓分解成点集放入向量poly中
std::vector::const_iterator itp = poly.begin();
//遍历每个线段进行绘制
while (itp != poly.end() - 1)
{
cv::line(result, *itp, *(itp + 1), cv::Scalar(0), 2);
++itp;
}
//首未用直线相连
cv::line(result ,*(poly.begin()), *(poly.end() -1), cv::Scalar(0), 2);
//4.测试凹包
std::vector hull;
cv::convexHull(cv::Mat(contours[6]), hull);
std::vector::const_iterator ith = hull.begin();
//遍历每个线段进行绘制
while (ith != hull.end() - 1)
{
cv::line(result, *ith, *(ith + 1), cv::Scalar(0), 2);
++ith;
}
//首未用直线相连
cv::line(result, *(hull.begin()), *(hull.end() - 1), cv::Scalar(0), 2);
//5.测试力矩 遍历所有轮廓
std::vector::const_iterator itc = contours.begin();
while (itc != contours.end())
{
cv::Moments mom = cv::moments(cv::Mat(*itc));
*itc++;
cv::circle(result, cv::Point(mom.m10 / mom.m00, mom.m01 / mom.m00), 2, cv::Scalar(0), 2);//画出质心坐标
}
cv::namedWindow("result1");
cv::imshow("result1", result);
cv::waitKey(0);
return 0;
}