將一個圖片的各個輪廓用凸包包圍。

#include <iostream>
#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;



#define window "【原始圖】"
#define windowx "【結果圖1】"
#define windowy "[結果圖2]"
//

RNG rng = theRNG();
int thresh = 40;
Mat edge;
Mat src_gray;
Mat result;

void on_thresh(int,void*);
int main()
{
	//1.讀取圖片並對圖片進行灰度化處理
	Mat src = imread("21.jpg");
	
	cvtColor(src,src_gray,CV_BGR2GRAY);
	imshow(window,src_gray);
	//2.對圖片過濾,並且進行閾值化處理
	blur(src_gray,src_gray,Size(3,3));

	namedWindow(windowx);
	createTrackbar("thresh",windowx,&thresh,255,on_thresh);
	imshow(windowx,src);

	
	
		

	

	waitKey(0);
	return 0;

}


void on_thresh(int,void*)
{
	threshold(src_gray,edge,thresh,255,THRESH_BINARY);
	
	//3.找圖片的輪廓。findcouter
	vector<vector<Point>> contours;
	vector<Vec4i> index;
	findContours(edge, contours, index, CV_RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
	//4.找出各個輪廓的點集的凸包。
	vector<vector<Point>> hull(contours.size());//.........................多少個這樣的hull,有多少輪廓數,就有多少個凸包。hull有兩種方式,一種是返回下標,一種是直接返回點。
	for (int i = 0; i < contours.size(); ++i)
	{

		convexHull(contours[i], hull[i], false);

	}
	//5.將這些凸包畫在與原圖一樣大的圖像上。
	result = Mat::zeros(src_gray.size(), CV_8UC3);
	for (int i = 0; i < hull.size(); ++i)
	{
		//line(result,hull[i][0],hull[i][hull[i].size()-1],Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)));
		Point pre = hull[i][hull[i].size() - 1];
		int color = rng.uniform(0, 255);
		for (int j = 0; j < hull[i].size(); ++j)
		{

			line(result, pre, hull[i][j], Scalar(color, color, color));
			pre = hull[i][j];

		}


	}
	//6.顯示結果。
	imshow(windowx, result);
	//
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章