如何从车道检测项目入门OpenCV?
摘要:从车道检测项目入门open cv 前提声明:非常感谢b站up主 嘉然今天吃带变,感谢其视频的帮助。同时希望各位大佬积积极提出宝贵的意见。😊😊😊(
从车道检测项目入门open cv
前提声明:非常感谢b站up主 嘉然今天吃带变,感谢其视频的帮助。同时希望各位大佬积积极提出宝贵的意见。😊😊😊(❁´◡`❁)(●'◡'●)╰(°▽°)╯
github地址:https://github.com/zhongzhengli13/openCV_Lane_Detection
视频地址:从车道检测项目入门open cv
基础知识
cv2.imread & cv2.imshow & cv2.imwrite
import cv2 as cv
img = cv.imread("img.png", cv.IMREAD_GRAYSCALE) #将图片转为灰度图
但是当前会存在一些问题,图片会闪一下,看不清楚,所以我们可以加上阻塞 cv2.waitKey()函数
#完整版
import cv2 as cv
img = cv.imread("img.png", cv.IMREAD_GRAYSCALE)
print(type(img))
print(img.shape)
cv.imshow('image', img)
k = cv.waitKey(0) # 阻塞 #k相当于检测你的输入的ascii值
print(k)
# while True:
# if cv.waitKey(0) == ord('q'):
# cv.destroyAllWindows()
# else:
# img = cv.imread("img.png", cv.IMREAD_GRAYSCALE)
cv.imwrite("img_gray.png", img)#生成img图片,保存到当前目录中~
效果展示
原始图像:
灰度图:
Canny边缘检测
通过求取图像上每一个像素点周边图像像素变化的梯度,来确定这个点是否是边缘。
梯度的方向一般总是与边界垂直,梯度的方向被归为四类:垂直、水平和两个对角线(即,0度、45度、90度和135度四个方向)。
我们现在的想法是设置一个阈值,当梯度大于阈值时,我们可以认为该点是边缘。但是随之而来的是,图片会产生一些毛边或者光线,角度等问题,导致可能会误判。
为了解决这个问题,我们采用双阈值的方法,一个上阈值,一个下阈值。
我们认为高于上阈值的点为强边缘,在上阈值和下阈值之间的我们认为是弱边缘。
我们认为只有弱边缘与强边缘相连的话,才是边缘。B不认为是边缘,可能是噪声;C与A强边缘相连,我们认为C是边缘。
import cv2
img = cv2.imread("img.png", cv2.IMREAD_GRAYSCALE)
edge_img = cv2.Canny(img, 190, 350) # 下边缘和上边缘的阈值设定 #需要自行更改
cv2.imshow("edge", edge_img)
cv2.waitKey(0)
当上边缘和下边缘都升高时,边缘显示会越来越少。
ROI mask
简单来讲就是类似于抠图,就是剔除无关信息的边缘。
roi : region of interest 感兴趣的区域
数组切片
布尔运算(与运算)
cv2.fillPoly 是 OpenCV 中的一个函数,用于在图像中填充多边形区域。它常用于绘制、遮罩或标记图像中的特定区域。通过指定多边形的顶点,cv2.fillPoly 可以将这些区域填充为指定的颜色。
cv2.bitwise_and 是 OpenCV 中的一个函数,用于对两个图像或数组进行按位与(bitwise AND)操作。按位与操作是逐像素进行的,只有当两个图像的对应像素都为非零值时,结果图像的该像素才为非零值。
图像遮罩:
使用掩码提取图像的特定区域。例如,将一个形状(如矩形、圆形或多边形)作为掩码,只保留掩码内的图像内容。
图像合成:
将两个图像的特定部分组合在一起。
图像处理:
在图像处理中,按位与操作常用于对图像进行区域选择或区域遮挡。
图像以矩阵np.array形式存储在内存中
np.zeros_like : np.zeros_like 是 NumPy 库中的一个函数,用于创建一个与给定数组形状和数据类型相同的数组,但所有元素都初始化为零。
