cpp
              复制代码
              
            
          
          #include "iostream"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
	Mat  img, temp, temp2,dst, dstbin, distancetransform,rel, rel2,gary, _threshold, temp3, OPEN;
	img = imread("shou2.jpg");
	resize(img, dst, Size(0, 0), 0.1, 0.1);
	dst.copyTo(temp3);
	cvtColor(dst, gary, COLOR_BGR2GRAY);
	threshold(gary, _threshold, 50, 255, THRESH_TOZERO);
	Mat kernel = getStructuringElement(1, Size(3, 3));
	morphologyEx(_threshold, OPEN, MORPH_OPEN, kernel);
	GaussianBlur(OPEN, temp2, Size(5, 5), 5, 0);
	threshold(temp2, rel, 100, 255, THRESH_BINARY);
	Mat canny;
	Canny(rel, canny, 50, 170, 3, false);
	//Mat kernel = getStructuringElement(1, Size(3, 3));
	//erode(canny, canny, kernel);
	dilate(canny, canny, kernel);
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(canny, contours, hierarchy, 0, 2, Point());
	for (int i = 0; i < contours.size(); i++)
	{
		vector<Point> pointss;
		convexHull(contours[i], pointss);
	
		for (int j = 0; j < pointss.size(); j++)
		{
			if (j == pointss.size()-1)
			{
				line(dst, pointss[j], pointss[0], Scalar(0, 0, 255));
				break;
			}
			line(dst, pointss[j], pointss[j + 1], Scalar(0, 0, 255));
		}
	
	}
	imshow("dst", dst);
	imshow("temp3", temp3);
	imshow("canny", canny);
	waitKey(0);
	return 1;
}