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; }
相关文章推荐
- 【OpenCV3】图像轮廓查找与绘制——cv::findContours()与cv::drawContours()详解
- Opencv 图像结构分析与形状识别—— drawContours函数用于绘制和填充
- Axure RP Pro - 翻译 - 5.5 Tutorial教程 - AXURE 201 Article 5: Rich Interactions复杂交互 - Shape, Image & Menu Styles形状、图像和菜单样式
- cvDrawContours:在图像上绘制外部和内部轮廓
- opencv学习笔记 在输入图像上寻找并绘制轮廓
- OPencv把图像二值化后在绘制轮廓
- 利用鼠标绘制矩形和截取图像的矩形区域并保存(OpenCV2.4.5)
- OpenCV学习——图像轮廓的提取和绘制
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- opencv图像结构与形状分析
- How to draw a shape on top of a UIImage while respecting the image's alpha mask
- OpenCV 2 学习笔记(15): 绘制图像直方图
- cvDrawContours:在图像上绘制外部和内部轮廓
- 在wxWidgets中使用OpenCV绘制摄像头图像
- OpenCV学习笔记(十四)——图像结构分析与形状描述ImgProc
- OpenCV中,在图像上覆盖绘制另一幅图圆形图像
- 图像绘制功能【OpenCV学习笔记5】
- cvDrawContours:在图像上绘制外部和内部轮廓
- OpenCV-绘制图像的像素直方图-Histogram
- 模型图像ASM(Active Shape Model) 主动形状模型总结