【opencv关于轮廓上的点操作--轮廓篇3】

轮廓周围绘制矩形框

vector<vector<Point>>,vector<V e c 4 i>,vector<R e c t>,vector<R o t a t e d R e c t>

vector<vector<Point>>:

vector容器里面放了一个vector容器,子容器里放点

vector<V e c 4 i>:放了4维int向量

vector<R e ct>: 像素width * height   from  位置(x*y)

vector<R o t a t e d R e c t>:如图三个成员

基本绘制程序:


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


using namespace cv;
using namespace std;
 
int main() {

	Mat src, gray_src, drawImg, bin_output;

 
	src = imread("F:/Temp_vs/pic/09.jpg");

	namedWindow("input", CV_WINDOW_AUTOSIZE);

	namedWindow("output", CV_WINDOW_AUTOSIZE);

	imshow("input", src);

	cvtColor(src, gray_src, CV_BGR2GRAY);

	blur(gray_src, gray_src, Size(10, 10), Point(-1, -1), BORDER_DEFAULT);

 

	//这些个类型

	vector<vector<Point>> contours;

	vector<Vec4i> hierarchy;

	

	threshold(gray_src, bin_output, 144, 255, 0);					//二值化

	findContours(bin_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));		//找轮廓

 

	//这些个类型

	vector<vector<Point>> contours_poly(contours.size());

	vector<Rect> poly_rects(contours.size());

	vector<RotatedRect> minRect(contours.size());

 

	//取点

	for (size_t i = 0; i < contours.size(); i++)

	{

		approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); //减少轮廓点数

 

		poly_rects[i]=boundingRect(contours_poly[i]);//获取绘制矩形数据

 

		if (contours_poly[i].size() > 5) {				

			minRect[i] = minAreaRect(contours_poly[i]);//获取绘制旋转矩形数据

		}

	}

 

	//开始绘制

	src.copyTo(drawImg);

	Point2f pst[4];//储存单个旋转矩形的四个点

	cout << "----------Point2f pst[4]------------" << endl;

	for (size_t i = 0; i < contours.size(); i++)

	{

		rectangle(drawImg, poly_rects[i],  Scalar(255, 0, 0), 2, 8);//绘制矩形框

 

		minRect[i].points(pst);//用线段画矩形,将RotatedRect类型转化为四个点	

 

		for (size_t u = 0; u < 4; u++)

		{

			line(drawImg, pst[u], pst[(u + 1) % 4], Scalar(0, 255, 0), 2, 8);

			cout << pst[u];			//显示pst的数据

		}

		cout << endl;

		Rect brect = minRect[i].boundingRect(); //返回包含旋转矩形的最小矩形  

		rectangle(drawImg, brect,Scalar(0, 0, 255));

	}

	cout << endl;

	imshow("output", drawImg);

 

	cout << "----------vector<vector<Point>> contours_poly------------" << endl;

	for (size_t i = 0; i < contours_poly.size(); i++)

	{

		cout << "第" << i << "行:";

		for (size_t j = 0; j < contours_poly[i].size(); j++)

		{

			cout<<contours_poly[i][j];

		}

		cout << endl;

	}

	cout << endl;

 

	cout << "----------vector<Vec4i> hierarchy------------" << endl;

	for (size_t i = 0; i < hierarchy.size(); i++)

	{

		cout << hierarchy[i] << endl;

	}

	cout << endl;

	

	cout << "----------vector<Rect> poly_rects------------" << endl;

	for (size_t i = 0; i < poly_rects.size(); i++)	

	{

		cout << poly_rects[i]<<endl;

	}

	cout << endl;

	

	cout << "---------vector<RotatedRect> minRect------------" << endl;

	for (size_t i = 0; i <minRect.size(); i++)	//显示一下点minRect

	{

		cout <<"angle:"<< minRect[i].angle<<" center:"<< minRect[i].center<<" size:"<< minRect[i].size<<endl;

	}

	cout << endl;
	waitKey(0);
	return 0;

}

遍历轮廓上的边缘点:

for (std::vector<std::vector<cv::Point> >::iterator it = contours.begin();it != contours.end();it++)
				{
					if (contourArea(*it) > temparea-10)
					{
						for(std::vector<cv::Point>::iterator inter=it->begin();inter!=it->end();inter++)
						{
							if((inter->x)>right_point_x)
							{
								right_point_x=inter->x;
								p=*inter;
							}
						}
					}
				}

猜你喜欢

转载自blog.csdn.net/qq_35054151/article/details/86349600
今日推荐