OPENCV C++(七)霍夫线检测+找出轮廓和外接矩形+改进旋转

霍夫线检测

cpp 复制代码
vector<Vec2f> lines1;
	HoughLines(canny_mat, lines1, 1, CV_PI / 180.0,90 );//45可以检测里面两条线 80检测出外边两条线

定义存放输出线的向量 此向量输出有<距离,角度>

因为检测的原理就是在变换霍夫空间里面去检测的,这里可以理解为极坐标

第3个参数是距离精度 第四个参数是角度精度,第五个是阈值,只有点超过90个才算一条线

在图中画线操作:

cpp 复制代码
Point ptz1, ptz2;
	for (size_t i = 0; i < lines1.size(); ++i) {
		float rth = lines1[i][0];//距离
		float theta = lines1[i][1];//角度
	
		double a = cos(theta);
		double b = sin(theta);
		double x0 = a * rth, y0 = b * rth;

		ptz1.x = cvRound(x0 + 1000 * (-b));
		ptz1.y = cvRound(y0 + 1000 * (a));
		ptz2.x = cvRound(x0 - 1000 * (-b));
		ptz2.y = cvRound(y0 - 1000 * (a));

		line(image1, ptz1, ptz2, Scalar(0, 255, 0), 2, 8);

	}

这里是画线操作

概率霍夫线检测

cpp 复制代码
vector<Vec4i>lines2;
	HoughLinesP(canny_mat, lines2, 1, CV_PI / 180.0, 25,25,32);//参数如何设置啊?  点数多少 最小长度 最大容忍间隔

后面三个参数依次是

// 大于阈值threshold的线段才可以被检测通过并返回到结果中。

// 表示最低线段的长度,比这个设定参数短的线段就不能被显现出来

// 允许将同一行点与点之间连接起来的最大的距离

这里的画线操作就简单一点 直接画

cpp 复制代码
	Point ptz3, ptz4;
	for (int j = 0; j < lines2.size(); j++) {
	

	
		ptz3.x = lines2[j][0];
		ptz3.y = lines2[j][1];
		ptz4.x = lines2[j][2];
		ptz4.y = lines2[j][3];
		
		line(image2, ptz3, ptz4, Scalar(0, 255, 255), 2, 8);

	}


轮廓的寻找

cpp 复制代码
	Mat binary;
	threshold(gray, binary, 84, 255, THRESH_OTSU);
	imshow("binary", binary);
	waitKey(0);
	cvDestroyAllWindows();

	vector<vector<Point>> contours;
	findContours(binary, contours, RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
	Mat image3clone = image3.clone();

	for (int i = 0; i < contours.size(); i++) {
		drawContours(image3clone, contours, i, Scalar(0, 255, 255), 2, 8);
	}

先是二值化图像,再用findcontours函数寻找轮廓,后面两个参数是寻找最外轮廓,内接轮廓就不管,用的是简单保存的方式。

画出轮廓用的是drawcontours来画轮廓,直接在图像上画出轮廓即可

画出轮廓外最小外接矩形

cpp 复制代码
Point2f vtx[4];
	RotatedRect rbox = minAreaRect(contours[0]);
	rbox.points(vtx);
	for (int i = 0; i < 4; i++) {
		line(image3, vtx[i], vtx[i < 3 ? i + 1 : 0], CV_RGB(0, 255, 0), 2, CV_AA);
	}

定义4个点存储外接矩形定点,minAreaRect是外接矩形的rect,rbox.points是赋值给vtx,然后用一个简单的画线操作,依次画点和点的连线

改进版的图像旋转

前面的获得矩阵操作一样

cpp 复制代码
	float angel = -10.0, scale = 1;
	Point2f center(lena.cols * 0.5, lena.rows * 0.5);
	Mat rot = getRotationMatrix2D(center, angel, scale);

获得外接矩形的作为最后的大小

cpp 复制代码
Rect bbox = RotatedRect(center, lena.size(), angel).boundingRect();//获取外接矩形

然后得调整rot矩阵得参数,因为中心点有所偏移,需要平移操作

cpp 复制代码
rot.at<double>(0, 2) += bbox.width / 2.0 - center.x;//调整仿射变换矩阵参数【a,b,l/n b,c,m】此步在调节l,m值
rot.at<double>(1, 2) += bbox.height / 2.0 - center.y;//				
Mat dst;
warpAffine(lena, dst, rot, bbox.size());

即可完成没有缺损得旋转图像!

相关推荐
说私域6 分钟前
智能名片链动2+1模式S2B2C商城小程序:构建私域生态“留”量时代的新引擎
大数据·人工智能·小程序
说私域8 分钟前
基于开源AI大模型与AI智能名片S2B2C商城小程序的直播简介引流策略研究——以B站直播为例
人工智能·小程序
金紫火15 分钟前
AiPPT 新功能体验:从“一键生成”到更智能的演示制作
人工智能·ppt
Dev7z18 分钟前
基于计算机视觉与机器学习的课堂坐姿智能监测与预警系统
人工智能·机器学习·计算机视觉
curry____30322 分钟前
基本算法(2025.11.21)
c++·算法
水如烟24 分钟前
孤能子视角:“多劳多得”原则在知识经济时代的失效危机分析
人工智能
钟屿26 分钟前
Back to Basics: Let Denoising Generative Models Denoise 论文阅读学习
论文阅读·人工智能·笔记·学习·计算机视觉
张较瘦_28 分钟前
[论文阅读] AI + 数据库 | 拆解智能数据库:交互、管理、内核三层革新,AI 如何重塑数据处理
数据库·论文阅读·人工智能
深兰科技37 分钟前
智融无界·浦绘未来|深兰科技受邀出席“2025浦东新区产业智能化创新发展年度活动”,陈海波发表主旨演讲
人工智能·jupyter·vim·intellij-idea·postman·visual studio·深兰科技
说私域1 小时前
开源AI大模型、AI智能名片与S2B2C商城小程序在互联网与传统行业融合中的应用与影响
人工智能·小程序·开源