您当前的位置: 首页 >  opencv

惊鸿一博

暂无认证

  • 3浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenCV_Draw the Shape Descriptor(绘制图像的形状描述符)

惊鸿一博 发布时间:2017-03-23 00:25:17 ,浏览量:3

#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;
}

关注
打赏
1663399408
查看更多评论
立即登录/注册

微信扫码登录

0.0415s