opencv开发笔记(十三):寻找和绘制物体的凸包

来源:互联网 发布:淘宝自定义导航条代码 编辑:程序博客网 时间:2024/06/05 19:14
// 寻找和绘制物体的凸包.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#define window1 "原始图"
#define window2 "效果图"
Mat src, gray;
int nth = 50;
int nthmax = 255;
RNG rng(12345);
Mat srccopy = src.clone();
Mat output;
vector<vector<Point>>counts;
vector<Vec4i>vhi;
void ontresh(int,void *);
int main()
{   
src = imread("E:\\Pictures\\1.jpg");
cvtColor(src, gray, COLOR_BGR2GRAY);
blur(gray,gray,Size(3,3));
imshow(window1,src);
createTrackbar("阈值",window1,&nth,nthmax,ontresh);
ontresh(0, 0);
waitKey(0);
    return 0;
}
void ontresh(int, void *) {


threshold(gray,output,nth,255,THRESH_BINARY); //图像二值话控制阈值
findContours(output,counts,vhi,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));//寻找轮廓
//遍历每个轮廓寻找凸包
vector<vector<Point>>hull(counts.size());
for (unsigned int i = 0; i<counts.size();i++) {
convexHull(Mat(counts[i]), hull[i], false);

}
//绘制轮廓和凸包
Mat draw = Mat::zeros(output.size(), CV_8UC3);
for (unsigned int i = 0; i < counts.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(draw,counts,i,color,1,8,vector<Vec4i>(),0,Point());
drawContours(draw,hull,i,color,1,8,vector<Vec4i>(),0,Point());
}
imshow(window2,draw);
}

阅读全文
0 0