用更加复杂的opencv c++代码实现车道线检测代码实现
时间: 2023-11-20 17:40:43 浏览: 52
下面是一个基于 OpenCV C++ 的车道线检测代码示例:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 读取视频
VideoCapture cap("test.mp4");
// 检查视频是否打开
if (!cap.isOpened()) {
cout << "Error opening video stream or file" << endl;
return -1;
}
// 创建窗口
namedWindow("Lane Detection", WINDOW_NORMAL);
// 循环读取每一帧
while (true) {
Mat frame;
cap >> frame;
// 检查是否到达视频结尾
if (frame.empty()) {
break;
}
// 转换为灰度图像
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
// 高斯模糊
Mat blurred;
GaussianBlur(gray, blurred, Size(5, 5), 0);
// canny边缘检测
Mat edges;
Canny(blurred, edges, 50, 150);
// ROI选择(仅保留感兴趣区域)
Mat mask = Mat::zeros(edges.rows, edges.cols, CV_8UC1);
Point pts[4] = {
Point(0, edges.rows),
Point(400, 300),
Point(500, 300),
Point(edges.cols, edges.rows)
};
fillConvexPoly(mask, pts, 4, Scalar(255, 0, 0));
Mat maskedEdges;
bitwise_and(edges, mask, maskedEdges);
// 霍夫线变换
vector<Vec4i> lines;
HoughLinesP(maskedEdges, lines, 1, CV_PI/180, 20, 20, 10);
// 画出检测到的车道线
Mat line_image = Mat::zeros(maskedEdges.size(), CV_8UC3);
for (size_t i = 0; i < lines.size(); i++) {
Vec4i l = lines[i];
line(line_image, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);
}
// 合并原始图像和检测到的车道线图像
Mat combined_image;
addWeighted(frame, 0.7, line_image, 1, 0, combined_image);
// 显示结果
imshow("Lane Detection", combined_image);
// 等待按键
if (waitKey(25) == 27) {
break;
}
}
// 释放视频
cap.release();
// 关闭窗口
destroyAllWindows();
return 0;
}
```
这个示例使用了 OpenCV 中的一些常见函数,如 cvtColor、GaussianBlur、Canny、fillConvexPoly、HoughLinesP 等。其中,关键的步骤是通过霍夫线变换检测车道线,并将检测到的线画到图像上。同时,为了减少检测到的线数量,需要在边缘检测后选择感兴趣区域(ROI)并应用掩膜。最后,使用 addWeighted 函数将原始图像和检测到的车道线图像合并。