2021-08-09暑期专题培训2(opencv7)

第7章 提取直线、轮廓与连通区域
使用Canny算子检测轮廓
使用霍夫变换检测直线
用直线拟合一组点
提取连通区域的轮廓
计算连通区域的形状描述符

7.1提取像素快中重要的图像特征
7.2使用Canny算子检测轮廓
cv::Canny函数,指定两个阈值。

//2021.8.10 直线,边缘轮廓
#include
#include
using namespace cv;

int main() {
   
	Mat src;
	src = imread("D:/opencvcode/img/12.png");
	if (!src.data) {
   
		printf("not img!");
		return -1;
	}



	//应用Canny算法
	cv::Mat contours;
	cv::Canny(src,//灰度图
		contours,//输出轮廓
		125,//低阈值
		350);//高阈值

	Mat contoursInv;//反转后的图像
	threshold(contours, contoursInv,
		128,//低于该值的像素
		255,//将变成255
		THRESH_BINARY_INV);

	namedWindow("inputimg");
	imshow("inputimg", src);
	waitKey(0);
	return 0;
}

7.3使用霍夫变换检测直线
霍夫变换(Hough Transform)是检测直线的经典算法,最初只用于检测直线,扩展后鞥检测其他的简单结构。
opencv提供两种霍夫变换的实现,基础版本是HoughLines。

	
	//Hough变换检测直线
	std::vector<Vec2f>lines;
	double PI=3.14159;
	//Mat test;
	HoughLines(src, lines,
		1, PI / 180,//步进尺寸
		80);//最小投票数

	vector<Vec2f>::const_iterator it = lines.begin();
	Mat result;
	while (it!=lines.end())
	{
   
		float rho = (*it)[0];//第一个参数为距离rho
		float theta = (*it)[1];//第二个参数为角度theta
		if (theta < PI / 4. || theta>3. * PI / 4.) {
   //~垂直线
			//线与第一行的交点
			Point ptl(rho / cos(theta), 0);
			//线与最后一行的交点
			Point pt2((rho-result.rows*sin(theta))/
				cos(theta), result.rows);
			//绘制白线
			line(src, ptl, pt2, Scalar(255), 1);
		}
		else{
   //~水平线
			//线与第一列的交点
			Point pt1(0, rho / sin(theta));
			//线与最后一列的交点
			Point pt2(src.cols,
				

你可能感兴趣的:(opencv,opencv)