从车道线检测入门OpenCV

这篇博客介绍了OpenCV中图像处理的基础操作,包括图片的读取、展示和保存,以及彩色图像和灰度图像的概念。接着详细讲解了Canny边缘检测算法,阐述了边缘认定标准,并展示了如何应用Canny边缘检测。此外,还讨论了ROI区域的处理,使用fillPoly和bitwise_and函数进行图像操作。随后,文章深入介绍了霍夫变换,解释了二值图像和霍夫变换在寻找直线时的原理,并给出了霍夫变换的代码实现。最后,文章涉及离群值过滤和最小二乘拟合,用于进一步优化直线检测的结果。

本文为纯小白之作(So大佬读者们可以移步了),读者可结合视频,

相信大家“一定”(当否定的概率小到渺茫时我认为其为绝对事件bushi)看不到文末,

所以看到开头的小伙伴可以点个赞不?       

                                                                                                                             ——快裂开的小白

目录

#01图片的读取、展示和保存

彩色图像

灰度图像

代码

#02Canny边缘检测

边缘认定标准

代码

#03.roi_mask

fillPolly函数

numpy.array函数:

bitwise_and函数

代码

#04霍夫变换

二值图像

cv2.line()

cv2.HoughLinesP()

代码

#05离群值过滤

show me the code!

#06最小二乘拟合

polyfit()和polyval()

np.ravel()

代码片段

#07画直线

#08视频流读写

一、基础函数

#1.cap = cv2.VideoCapture()

#2.ret,frame = cap.read()

#3.cv2.resize()

#4.cv2.cvtcolor()

#5.cv2.inRange()

二、滑动条

cv2.createTrackbar()

cv2.getTrackbarPos()

cv2.setTrackbarPos()


#01图片的读取、展示和保存

彩色图像

图像中的每个像素值都分成B(蓝)、G(绿)、R(红)三个基色分量,每个基色分量直接决定其基色的强度,这样产生的色彩称为真彩色。例如图像深度为24,用B:G:R=8:8:8来表示色彩,则R、G、B各占用8位来表示各自基色分量的强度,每个基色分量的强度等级为2^8=256种。图像可容纳2^24=16M种色彩(24位色)。24位色被称为真彩色,它可以达到人眼分辨的极限,发色数是1677万多色,也就是2的24次方。

灰度图像

每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度 ,像素0~255,越大越亮。

####waitkey()函数

cv2.waitkey(delay),delay 的单位为ms毫秒,当 delay 取大于0的值时,程序在给定的 delay 时间内等待用户按键触发,如果用户没有按下键,则继续等待下一个delay时间(循环),直到用户按键触发,退出程序。若设置delay为0,则表示必须点击窗口界面的×才能关闭程序。 若设置delay的值小于0,等待键盘按键,任何一个按键都会关闭程序,默认参数为小于0(我电脑上打印出来是-1)。 ———————————————— 版权声明:本文为CSDN博主「楊建业」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:opencv中cv2.waitkey()参数详解_csdn_bajie-CSDN博客_cv2.waitkey(0)

代码

'''_read_and_display.py

import cv2
img=cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)
print(type(img))
print(img.shape)
'''
cv2.imshow('image',img)
k = cv2.waitKey(0)print(k)
'''
cv2.imwrite('img_gray.jpg',img)
print('yes')

常数用大写表示:cv2.IMREAD_GRAYSCALE == 0

(一开始imwrite函数不报错但却不能生成图片,然后康康学长说我的.py文件是在venv虚拟环境里的,所以跟视频里不一样,然后我点“项目”就突然好了。。。我不知道发生了啥。)

#02Canny边缘检测

边缘认定标准

 

cv2.Canny()函数,第一个参数是输入图像,第二、三个参数是minVal和maxVal

处在上、下阈值之间的为弱边缘,大于上阈值的为强边缘(我们认为它肯定是边缘),弱边缘中与强边缘相连的才视为真正的边缘:

如上图将c看作边缘,b为噪声。

 

 

选取四个梯度方向(实际上相当于八个方向,因为有正负)

代码

'''_edge_detect.py

import cv2
img = cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)
edge_img=cv2.Canny(img,70,120)
cv2.imshow('edges',edge_img)
cv2.waitKey(0)

#03.roi_mask

·ROI ( region of interest , 感兴趣的区域 )

·数组切片

·布尔运算(与运算)

np.zeros_like(a) : 构建一个与a同维度的数组,并初始化为0.

fillPolly函数

fillPolly(img,ppt,npt,1,Scalar(255,255,255),lineType)

函数参数:

1.多边形将被画到img上

2.多边形的顶点集为ppt(注意点的顺序)

3.绘制的多边形顶点数目为npt

4.要绘制的多边形数量为1

5.多边形的颜色定义为Scarlar(255,255,255),即RGB的值为白色

注意:点构成的边界,要加中括号

颜色原理:

按位与:因为掩膜图片中ROI区域的白色部分,即255(二进制是11111111,故与此部分相与仍是原数,

非ROI区域黑色,即00000000,与全0相与那么就会变成0,即不感兴趣的部分就会变成黑色

numpy.array函数:

一个常见的错误包括用多个数值参数调用array而不是提供一个由数值组成的列表作为一个参数。

>>> a = array(1,2,3,4)    # WRONG
​
>>> a = array([1,2,3,4])  # RIGHT 

数组将序列包含序列转化成二维的数组,序列包含序列包含序列转化成三维数组等等。

>>> b = array( [ (1.5,2,3), (4,5,6) ] )
>>> b
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]]) 

数组类型可以在创建时显示指定

>>> c = array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]]) 

还有一篇讲得很详细:

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值