使用opencv实现车道线检测实战代码

 更新时间:2022年03月18日 15:11:24   作者:liu_jie_bin  
这篇文章主要介绍了opencv车道线检测实战,效果非常逼真,代码简单易懂,对opencv车道线检测实战代码感兴趣的朋友一起看看吧

效果

 void lane_detection(cv::Mat &src, cv::Mat &dst)
 {
     dst = cv::Mat::zeros(src.size(),src.type());
     cv::Mat grid =cv::Mat::zeros(src.size(),src.type());
     int iStep = 25;
     int iNUmsX = src.cols / iStep;
     int inUmsY = src.rows / iStep;

     for(int i = 1; i <= inUmsY; i++)
     {
         int yPos = i * iStep + src.cols / 5;
         cv::Point2d pt1,pt2;
         int iOffset = 10;
         pt1.x = 0 + iOffset;
         pt1.y = yPos;
         pt2.x = src.cols - iOffset;
         pt2.y = yPos;
         cv::line(grid,pt1,pt2,cv::Scalar(255), 1, cv::LINE_4);
     }
     for(int i = 1; i <= iNUmsX; i++)
         int xPos = i * iStep;
         pt1.x = xPos;
         pt1.y = 0 + iOffset + src.rows / 5;
         pt2.x = xPos;
         pt2.y = src.rows - iOffset;
     cv::imshow("grid", grid);
     cv::Mat bitNot;
     cv::bitwise_and(src, grid, bitNot);
     cv::Mat add = cv::Mat::zeros(bitNot.rows, bitNot.cols,bitNot.type());
     int iDiffTh = 200;
     
     QTime timer;
     timer.start();
     //#pragma omp parallel for num_threads(10)
      for (int i = 1; i < bitNot.rows - 1; i++)
      {
          for (int j = 1; j < bitNot.cols - 1; j++)
          {
              int iValueX = (int)bitNot.at<uchar>(i, j);
              int iValueXPre = (int)bitNot.at<uchar>(i-1, j);
              int iValueXNext = (int)bitNot.at<uchar>(i+1, j);
              int iValueY = (int)bitNot.at<uchar>(i, j);
              int iValueYPre = (int)bitNot.at<uchar>(i, j-1);
              int iValueYNext = (int)bitNot.at<uchar>(i, j+1);
              if((iValueX - iValueXPre > iDiffTh && iValueX - iValueXNext > iDiffTh) ||
                  (iValueY - iValueYPre > iDiffTh && iValueY - iValueYNext > iDiffTh))
              {
                  add.at<uchar>(i, j) = 255;
              }
          }
      }
      qDebug()<<"process time: "<<timer.elapsed()<<" ms";
      //形态学预处理
      cv::Mat matDilate;
      cv::Mat k33 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9), cv::Point(-1, -1));
      cv::morphologyEx(add, matDilate, cv::MORPH_DILATE, k33, cv::Point(-1, -1), 3);
      cv::imshow("matDilate", matDilate);
    //cv::bitwise_not(src, matDilate, matRoi);
    cv::Mat matRoi;
    cv::bitwise_and(src, matDilate, matRoi);
    cv::imshow("matRoi", matRoi);
    cv::Mat matThresh;
    cv::threshold(matRoi, matThresh, 200, 255,cv::THRESH_BINARY);
    cv::imshow("matThresh", matThresh);
    //std::vector<std::vector<cv::Point>> contours;
    //cv::findContours(matThresh,contours,)
    std::vector<std::vector<cv::Point> > contoursDefect;
    std::vector<cv::Vec4i> hierarchyDefect;
    cv::Mat canves;
    cv::cvtColor(src, canves,cv::COLOR_RGBA2RGB);
    cv::findContours(matThresh, contoursDefect, hierarchyDefect, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
    for (size_t i = 0; i < contoursDefect.size(); i++)
    {
     cv::Mat contour(contoursDefect.at(i));//第i个轮廓
     double area = contourArea(contour);
     if (area >=  50)
         cv::Moments moment;//矩
         moment = moments(contour, false);
         cv::Point2d pt1;
         double m00 = moment.m00 + 0.01;
         pt1.x = moment.m10 / m00;//计算重心横坐标
         pt1.y = moment.m01 / m00;//计算重心纵坐标
         cv::drawContours(canves, contoursDefect, i, cv::Scalar(255, 255, 0), -1);
    }
    cv::imshow("canves", canves);
    cv::waitKey(0);
 }
 void test_lane_detection()
     int i = 0;
     while(1)
         cv::Mat src;
         QString  dir("D:\\QtProject\\Opencv_Example\\gen_grid_region\\scene_");
         QString path;
         if(i>9)  path =  QString("%1%2%3").arg(dir).arg(i++).arg(".png");
         else path = QString("%1%2%3%4").arg(dir).arg("0").arg(i++).arg(".png");
         cout<<path.toStdString();
         src = cv::imread(path.toStdString(), cv::IMREAD_GRAYSCALE);
         if (src.empty()) {
             cout << "Cannot load image" << endl;
             return;
         }
         cv::imshow("src", src);
         cv::Mat dst;
         lane_detection(src, dst);

到此这篇关于opencv车道线检测实战的文章就介绍到这了,更多相关opencv车道线检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ STL标准库std::vector扩容时进行深复制原因详解

    C++ STL标准库std::vector扩容时进行深复制原因详解

    我们知道,std::vector之所以可以动态扩容,同时还可以保持顺序存储,主要取决于其扩容复制的机制。当容量满时,会重新划分一片更大的内存区域,然后将所有的元素拷贝过去
    2022-08-08
  • Qt出现假死冻结现象的原因及解决方法

    Qt出现假死冻结现象的原因及解决方法

    应用程序出现假死或冻结现象通常是由于一些常见问题所导致的,本文主要介绍了Qt出现假死冻结现象的原因及解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • C语言中结构体(struct)的几种初始化方法

    C语言中结构体(struct)的几种初始化方法

    相信大家都知道struct结构体是C语言中非常重要的复合类型,初始化的方法很多,那么小编下面对这些方法进行总结,便于自己和大家以后查阅,有需要的可以参考借鉴。
    2016-08-08
  • C++ Boost Bind库示例分析使用

    C++ Boost Bind库示例分析使用

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言中强制类型转换的常见方法

    C语言中强制类型转换的常见方法

    强制类型转换是一种将一个数据类型转换为另一个数据类型的方法,这篇文章主要为大家整理了C语言中强制类型转换的方法,需要的可以参考一下
    2023-05-05
  • 详解c++中的异常

    详解c++中的异常

    程序在运行过程中,有对也就有错,正确那么就不用说了,但是如果错误,那么我们如何快速的定位到错误的位置,以及知道发生了什么错误。当一个函数发现自己无法处理的异常,就会抛出一个异常,让函数调用者直接或者间接的处理这个错误。本文将详解介绍c++中的异常
    2021-06-06
  • 一文详解matlab实现形态学图像处理

    一文详解matlab实现形态学图像处理

    这篇文章主要为大家介绍了matlab实现形态学图像处理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 一篇文章带你了解C语言内存对齐解决的问题

    一篇文章带你了解C语言内存对齐解决的问题

    内存对齐的目的是为了提高CPU读写内存里数据的速度。现代的CPU读取内存并不是一个一个字节挨着读取,这样做的效率非常低。现代的CPU一般以4个字节(32bit数据总线)或者8个字节(64bit数据总线)为一组,一组一组地读写内存里的数据
    2021-08-08
  • c++字符串char[]数组分割split问题

    c++字符串char[]数组分割split问题

    这篇文章主要介绍了c++字符串char[]数组分割split问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 浅析C语言初阶的常量和变量

    浅析C语言初阶的常量和变量

    在C程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量,本文将带你了解什么是常量和变量,以及使用方法,需要的朋友可以参考下
    2023-05-05

最新评论