当前位置: 首页 > news >正文

个人网站设计模板行业网站开发运营方案

个人网站设计模板,行业网站开发运营方案,做网站可以不写代码,10个免费自学网目录1、前言2、霍夫线变换2.1、霍夫线变换是什么?2.2、在opencv中的基本用法2.2.1、HoughLinesP函数定义2.2.2、用法3、识别车道3.1、优化3.1.1、降噪3.1.2、过滤方向3.1.3、截选区域3.1.4、测试其它图片图片1图片2图片31、前言 最近学习opencv学到了霍夫线变换&am…

目录

  • 1、前言
  • 2、霍夫线变换
    • 2.1、霍夫线变换是什么?
    • 2.2、在opencv中的基本用法
      • 2.2.1、HoughLinesP函数定义
      • 2.2.2、用法
  • 3、识别车道
    • 3.1、优化
      • 3.1.1、降噪
      • 3.1.2、过滤方向
      • 3.1.3、截选区域
      • 3.1.4、测试其它图片
        • 图片1
        • 图片2
        • 图片3


1、前言

最近学习opencv学到了霍夫线变换,霍夫线变换是一个查找图像中直线的算法,它的其中一种应用场景就是识别车道,本文以识别车道为例,介绍霍夫线的简单用法。

2、霍夫线变换

2.1、霍夫线变换是什么?

下面是chatGPT给出的说明:

霍夫线变换(Hough Line Transform)是一种图像处理技术,可以用于检测图像中的直线。它的基本思想是,将直线转换为参数空间,并在参数空间中寻找与图像中的边缘相对应的点,从而找到这些直线。霍夫线变换常用于计算机视觉领域,例如在车道线检测、图像拼接、人脸识别等方面应用广泛。

原理性的东西这里不讲,因为有点复杂,我看得也有点懵。

2.2、在opencv中的基本用法

2.2.1、HoughLinesP函数定义

opencv实现霍夫线变换的函数是HoughLinesP,它的定义如下。

void HoughLinesP( InputArray image, OutputArray lines,double rho, double theta, int threshold,double minLineLength = 0, double maxLineGap = 0 );

它的参数的含义如下:
image:8位、单通道二进制源图像。
lines:输出线的矢量。每条线由一个4元素矢量表示,可以传入vector< cv::Vec4i>类型。
控制精度:
rho:累加器的距离分辨率(以像素为单位)。
theta:累加器的角度分辨率(弧度)。
过滤:
threshold:累加器阈值参数。
minLineLength:最小行长度。小于该长度的线段将被拒绝。
maxLineGap:同一条线上链接点的最大允许间隙。

2.2.2、用法

因为HoughLinesP传入的图像必须是8位、单通道二进制源图像,所以在传入图像之前,需要做转灰度图-》转二进制图的操作。
opencv提供了一些转二进制图的方法,因为HoughLinesP的目的是找到直线,而直线其实也是轮廓的一部分,所以一般我们采用Canny算法来把灰度图转为二进制图。
例程:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace cv;int main() {Mat src = imread("road.png");imshow("src", src);Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);imshow("gray", gray);// Apply Canny edge detectionMat edges;Canny(gray, edges, 50, 150);imshow("canny", edges);// Perform Hough transform to find linesstd::vector<Vec4i> lines;HoughLinesP(gray, lines, 1, CV_PI / 180, 50, 50, 10);// Draw lines on output imageMat dst = src.clone();for (size_t i = 0; i < lines.size(); i++) {Vec4i vline = lines[i];line(dst, Point(vline[0], vline[1]), Point(vline[2], vline[3]), Scalar(0, 0, 255), 2);}imshow("dst", dst);waitKey(0);}

3、识别车道

首先准备一张图片,如下图所示,要识别出它的白色车道线。
请添加图片描述
我们直接使用上一节的例程,效果如下。
请添加图片描述
发现虽然车道是识别出来了,但是环境中的纹理也被误认为车道,所以要做进一步优化。

3.1、优化

3.1.1、降噪

从上面的Canny图可以看到,环境中的树木形成了密密麻麻的纹理,这些就是影响效果的因素之一。
经过测试,我选用了“二值化 - 》腐蚀 - 》膨胀”的方式来完成降噪,经过优化后的代码如下:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace cv;int main() {Mat src = imread("/road.png");imshow("src", src);Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);imshow("gray", gray);//二值化Mat thr;threshold(gray, thr, 100, 255, THRESH_BINARY);imshow("threshold", thr);// 腐蚀Mat eroded;Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));erode(thr, eroded, element);// 膨胀Mat dilated;dilate(eroded, dilated, element);imshow("dilated", dilated);// Apply Canny edge detectionMat edges;Canny(dilated, edges, 50, 150);imshow("canny", edges);// Perform Hough transform to find linesstd::vector<Vec4i> lines;HoughLinesP(edges, lines, 1, CV_PI / 180, 50, 50, 10);// Draw lines on output imageMat dst = src.clone();for (size_t i = 0; i < lines.size(); i++) {Vec4i vline = lines[i];line(dst, Point(vline[0], vline[1]), Point(vline[2], vline[3]), Scalar(0, 0, 255), 2);}imshow("dst", dst);waitKey(0);
}

优化后的效果如下:
请添加图片描述
从Canny中明显可以看到环境纹理少了很多。

3.1.2、过滤方向

在上图中,可以看到还有一些横向的纹理影响了效果,我们可以通过直线的方向来做进一步过滤。
在车的视角下,车道是朝中间斜的,两边车道成八字型,如图所示。
在这里插入图片描述
也就是说,车道的线在图像上倾斜角度不会小,所以我们可以在得出最终结果时,添加一个过滤条件:倾斜角度小于20度的直线不满足条件。
修改代码如下:

.....// Perform Hough transform to find linesstd::vector<Vec4i> lines;HoughLinesP(edges, lines, 1, CV_PI / 180, 50, 50, 10);// Draw lines on output imageMat dst = src.clone();for (size_t i = 0; i < lines.size(); i++) {Vec4i vline = lines[i];/* 过滤倾斜45度及以下的斜线 */float tanVal = (float)(vline[3] - vline[1]) / (vline[2] - vline[0]);if (abs(tanVal) < tan(CV_PI / 18)) continue;line(dst, Point(vline[0], vline[1]), Point(vline[2], vline[3]), Scalar(0, 0, 255), 2);}
.......

效果:
在这里插入图片描述

3.1.3、截选区域

在识别车道时,因为车道是在车的脚下,需要识别的图像只有相机拍下的下半截,所以这里还可以加多一层优化:把上半截图像砍掉,只处理下半截图像。
修改代码:

int main() {Mat src = imread("road.png");Rect vaildRect(0, src.rows / 2, src.cols, src.rows / 2);Mat src = src(vaildRect);imshow("src", src);
......

效果:
在这里插入图片描述

3.1.4、测试其它图片

图片1

因为拍照时的亮度不一,所以需要根据亮度来调整二值化时的阀值,此例用的是
threshold(gray, thr, 170, 255, THRESH_BINARY);
在这里插入图片描述

图片2

在这里插入图片描述

图片3

threshold(gray, gray, 150, 255, THRESH_BINARY);
在这里插入图片描述

http://www.yayakq.cn/news/363620/

相关文章:

  • 哪家微网站建设公司网站建设整体架构
  • 外贸平台免费网站网站seo策划方案
  • 洛阳建设网站制作最近大事件新闻
  • 网站建设 需求资料查询网站建设
  • asp怎么做网站个人网站搭建详细步骤
  • 网站备案不能访问软文推广的好处
  • vps怎么添加网站酒店管理系统
  • 优秀网站设计分析软件开发定制公司有哪些
  • 网站建设电脑大多怎么办wordpress 多说 登陆
  • 做网站服务器配置营销网站外包
  • 网站文章收录产品包装设计100例
  • 江苏广泽建设有限公司网站wordpress 开发者
  • 搭建一个影视网站西安企业网站制作公司
  • 哪里有做彩票网站了3d模型网
  • 那个网站能找到人二手车网站制作贵吗
  • 做同城信息网站怎么赚钱家装公司加盟哪个公司好
  • 温州网站建设活动企业融资方式
  • 上海网站建设公司 翱思游戏模板 wordpress
  • 深圳网站建设中为wordpress 百度站长
  • 如何建立一个网站要多少钱比百度更好的网站
  • 鞋厂网站模板wordpress调整页面布局
  • h5网站页面网站的色彩搭配
  • 重庆渝云建设有限公司榆林百度seo
  • 设计外贸网站wordpress怎么播放视频播放器
  • ps做购物小网站wordpress rss源
  • 网站建设需要多少手机应用开发工具
  • 小说盗版网站怎么做咖啡网站建设
  • 制作网站 公司简介贵港网站建设动态
  • 西部数码创建子网站做网站l价格
  • 企业网站设计与规划论文网络营销的技巧有哪些