您的位置:首页 > 运维架构

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

2017-03-23 00:25 621 查看
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

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 <std::vector<cv::Point>>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<int>(radius), cv::Scalar(0), 2);

//3.测试多边形
std::vector<cv::Point> poly;
cv::approxPolyDP(cv::Mat(contours[5]), poly, 5, true);//将轮廓分解成点集放入向量poly中
std::vector<cv::Point>::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<cv::Point> hull;
cv::convexHull(cv::Mat(contours[6]), hull);
std::vector<cv::Point>::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<std::vector<cv::Point>>::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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 图像识别