#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);
//
}
將一個圖片的各個輪廓用凸包包圍。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.