opencv实践项目-简单的车道线检测

1. 步骤

  • 原图加蒙版
  • 转灰度图
  • 二值检测
  • 高斯模糊
  • 边缘检测
  • 霍夫直线检测

2. 实现

原图:
在这里插入图片描述

代码:

#include <opencv2/opencv.hpp>
#include <vector>

using namespace cv;
using namespace std;


cv::Mat mask_of_image(cv::Mat image)
{
    int height = image.rows;//1470, 1106
    cv::Mat mask(image.size(), 0);

    std::vector<cv::Point> polygons{{0, height}, {2200, height}, {250, 100}};

    cv::fillPoly(mask, vector<std::vector<cv::Point>>{polygons}, (255,255,255));


    cv::Mat mask_image;

    cv::bitwise_and(image, image, mask_image, mask);

    return mask_image;

}

int main() {
    //读取图片
    Mat img = imread("/Users/xialz/Downloads/2.png");
    
    //添加蒙版
    cv::Mat gray_img;
    gray_img = mask_of_image(img);
    //转灰度图
    cvtColor(gray_img , gray_img , COLOR_BGR2GRAY);
    //二值化
    cv::Mat threshold_img;
    cv::threshold(gray_img, threshold_img, 200, 255, cv::THRESH_BINARY);
    //高斯模糊
    cv::Mat gauss_img;
    cv::GaussianBlur(threshold_img, gauss_img, Size(5,5), 3);
    //边缘检测
    cv::Mat canny_img;
    cv::Canny(gauss_img, canny_img, 180, 255);

    cv::imshow("canny_img", canny_img);
    //霍夫直线检测
    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(canny_img, lines, 1., CV_PI / 180, 30);
    
    //画线
    for (int i = 0; i < lines.size(); ++i) {
        cv::Vec4i line_ = lines[i];
        cv::line(img, cv::Point(line_[0], line_[1]), cv::Point(line_[2], line_[3]), cv::Scalar(0, 255, 0), 2, LINE_AA);
    }

    cv::imshow("img", img);

    waitKey(0);

    return 0;
}

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

=几点说明=

  • 为何加蒙版
    因为未加蒙版的情况下,会识别出上边的云,如下图:
    在这里插入图片描述
  • 关于霍夫检测函数
    可参考链接:链接
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值