c++ opencv 常画的一些图

这里主要介绍opencv经常用画的几种图形:

c++ opencv 常画的一些图_第1张图片

我们一般都会把图片转换为二值图 代码如下:

    Mat img = imread("2.png"); //读入图片
	imshow("原图", img);
	Mat dst1;
	//blur(img, dst1, Size(3, 3));
	medianBlur(img, dst1, 9);//均值滤波
	imshow("滤波图", dst1);
	cvtColor(dst1, dst1,7);
	threshold(dst1, dst1, 180, 255, 1);//二值化
	
	imshow("二值图", dst1);

做完二值化后我们在检测图片的轮廓,通过轮廓来对他进行画图(当然方法不唯一这里也可以经过边缘检测来实现):

    vector> contours;
	vector hierarchy;
	findContours(dst1,contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

	Mat dst2;
	dst2 = Mat::zeros(img.size(), img.type());
	for (int i = 0; i < contours.size(); i++) {
		if (contourArea(contours[i]) > 100) {
			drawContours(dst2, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy);
		}
		
	}
	imshow("轮廓图", dst2);

轮廓图效果:

c++ opencv 常画的一些图_第2张图片

正方形:

    vectorpoly_rects(contours.size());
	for (int i = 0; i < contours.size(); i++) {
		poly_rects[i] = boundingRect(contours[i]);
		rectangle(img, poly_rects[i], Scalar(255, 0, 0), 1, 8);
	}
	imshow("正矩形", img);

绘制正方形效果图:

c++ opencv 常画的一些图_第3张图片

 旋转矩形:

    Point2f ptr[4];
	vectorminRoats(contours.size());
	for (int i = 0; i < contours.size(); i++) {
		minRoats[i] = minAreaRect(convexs[i]);
	}
	for (int i = 0; i < contours.size(); i++) {
		minRoats[i].points(ptr);
		for (int r = 0; r < 4; r++) {
			line(img, ptr[r], ptr[(r + 1) % 4], Scalar(255, 255, 0), 1, 8);
		}

	}
	imshow("旋转矩形", img);

绘制旋转矩形效果图:

c++ opencv 常画的一些图_第4张图片

圆:

    vectorccs(contours.size());
 	vectorradius(contours.size());
	for (int i = 0; i < contours.size();i++) {
		minEnclosingCircle(convexs[i], ccs[i], radius[i]);
        circle(img, ccs[i], radius[i], Scalar(255, 255, 255));

	}
	imshow("绘制圆", img);

绘制圆效果图:

c++ opencv 常画的一些图_第5张图片

椭圆:

    vectormyllipse(contours.size());
	for (int i = 0; i < contours.size(); i++) {
		myllipse[i] = fitEllipse(convexs[i]);
        ellipse(img, myllipse[i], Scalar(255, 0, 255), 1, 8);
	}

	imshow("绘制椭圆", img);

绘制椭圆效果图:

c++ opencv 常画的一些图_第6张图片

计算轮廓的中心、面积、周长:

    vectorcontours_momnet(contours.size());
	vectorcss(contours.size());
	for (int i = 0; i < contours.size(); i++) {
		contours_momnet[i] = moments(convexs[i]);
		css[i]= Point(static_cast(contours_momnet[i].m10 / contours_momnet[i].m00), \
			static_cast(contours_momnet[i].m01 / contours_momnet[i].m00));
        circle(img, css[i], 2, Scalar(0, 100, 200), 1, 8);
	}
	for (int i = 0; i < contours.size(); i++) {
		//drawContours(img, contours, i, Scalar(0, 100, 100), 1, 8, hierarchy, 0);
		//12 计算每个轮廓的面积
		cout << "面积" << i << ":  " << contourArea(contours[i]) << endl;
		//13 计算每个轮廓的周长
		cout << "周长" << i << ":  " << arcLength(contours[i], true) << endl;
	}
	imshow("轮廓的中心点", img);
	waitKey(0);

效果图(轮廓中心画的有点小了自己可以调节一下):

c++ opencv 常画的一些图_第7张图片

c++ opencv 常画的一些图_第8张图片

你可能感兴趣的:(opencv,计算机视觉,c++)