opencv车道线检测

2D车道线检测算法总结 2D车道线论文整理 阅读详情

车道线检测,需要完成以下功能:

  1. 图像裁剪:通过设定图像ROI区域,拷贝图像获得裁剪图像
  2. 反透视变换:用的是室外采集到的视频,没有对应的变换矩阵。所以建立二维坐标,通过四点映射的方法计算矩阵,进行反透视变化。后因ROI区域的设置易造成变换矩阵获取困难和插值得到的透视图效果不理想,故没应用
  3. 二值化:先变化为灰度图,然后设定阈值直接变成二值化图像。
  4. 形态学滤波:对二值化图像进行腐蚀,去除噪点,然后对图像进行膨胀,弥补对车道线的腐蚀。
  5. 边缘检测:canny变化、sobel变化和laplacian变化中选择了效果比较好的canny变化,三者在代码中均可以使用,canny变化效果稍微好一点。
  6. 直线检测:实现了两种方法 1>使用opencv库封装好的霍夫直线检测函数,在原图对应区域用红线描出车道线 2>自己写一种直线检测,在头文件中,遍历ROI区域进行特定角度范围的直线检测。两种方法均可在视频中体现,第一种方法运行效率较快。
  7. 按键控制:空格暂停,其余键退出,方便调试和截图。

实现的效果 
这里写图片描述
在亮度良好道路条件良好的情况下,检测车前区域的车道线实现比较成功,排除掉高速护栏的影响,而且原图像还能完整体现。

这里写图片描述
车子行驶在高速公路大型弯道上,可以在一定角度范围内认定车道线仍是直线,检测出为直线。

这里写图片描述
车子切换过程中只有一根车道线被识别,但是稳定回变换车道后,实现效果良好。减速线为黄色,二值化是也被过滤,没造成影响。

这里写图片描述
这里写图片描述 
刚进入隧道时,摄像机光源基本处于高光状态,拍摄亮度基本不变,二值化图像时情况良好,噪声比较多但是没产生多大线状影响;当摄像头自动调节亮度,图像亮度变低,二值化时同一阈值把车道线给过滤掉,造成无法识别车道线的现象。

这里写图片描述
在道路损坏的情况下,由于阈值一定,基本上检测不出车道线。

结论

   实现的功能:实现了车道线检测的基本功能,反透视变换矩阵实现了但效果不太理想,使用自己写的直线检测部分,车道线识别抗干扰能力较强。

   缺点:整个识别系统都是固定的参数,只能在特定的环境产生良好的效果。

   改进空间:提取全部关键参数,每次对ROI图像进行快速扫描更新参数,否则使用默认参数。例如,可以选择每次5间隔取点,以像素最高点的85%作为该次二值化的阈值。从而做到动态车道线识别。

完整代码 
方法一 
main.cpp

#include<cv.h>
#include<cxcore.h>
#include<highgui.h>
#include"mylinedetect.h"

#include<cstdio>
#include<iostream>
using namespace std;

int main(){
    //声明IplImage指针
    IplImage* pFrame = NULL;
    IplImage* pCutFrame = NULL;
    IplImage* pCutFrImg = NULL;
    //声明CvCapture指针
    CvCapture* pCapture = NULL;
    //声明CvMemStorage和CvSeg指针
    CvMemStorage* storage = cvCreateMemStorage();
    CvSeq* lines = NULL;
    //生成视频的结构
    VideoWriter writer("result.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(856, 480));
    //当前帧数
    int nFrmNum = 0;
    //裁剪的天空高度
    int CutHeight = 310;
    //窗口命名
    cvNamedWindow("video", 1);
    cvNamedWindow("BWmode", 1);
    //调整窗口初始位置
    cvMoveWindow("video", 300, 0);
    cvMoveWindow("BWmode", 300, 520);
    //不能打开则退出
    if (!(pCapture = cvCaptureFromFile("lane.avi"))){
        fprintf(stderr, "Can not open video file\n");
        return -2;
    }
    //每次读取一桢的视频
    while (pFrame = cvQueryFrame(pCapture)){
        //设置ROI裁剪图像
        cvSetImageROI(pFrame, cvRect(0, CutHeight, pFrame->width, pFrame->height - CutHeight));
        nFrmNum++;
        //第一次要申请内存p
        if (nFrmNum == 1){
            pCutFrame = cvCreateImage(cvSize(pFrame->width, pFrame->height - CutHeight), pFrame->depth, pFrame->nChannels);
            cvCopy(pFrame, pCutFrame, 0);
            pCutFrImg = cvCreateImage(cvSize(pCutFrame->width, pCutFrame->height), IPL_DEPTH_8U, 1);
            //转化成单通道图像再处理
            cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
        }
        else{
            //获得剪切图
            cvCopy(pFrame, pCutFrame, 0);
#if 0       //反透视变换
            //二维坐标下的点,类型为浮点
            CvPoint2D32f srcTri[4], dstTri[4];
            CvMat* warp_mat = cvCreateMat(3, 3, CV_32FC1);
            //计算矩阵反射变换
            srcTri[0].x = 10;
            srcTri[0].y = 20;
            srcTri[1].x = pCutFrame->width - 5;
            srcTri[1].y = 0;
            srcTri[2].x = 0;
            srcTri[2].y = pCutFrame->height - 1;
            srcTri[3].x = pCutFrame->width - 1;
            srcTri[3].y = pCutFrame->height - 1;
            //改变目标图像大小
            dstTri[0].x = 0;
            dstTri[0].y = 0;
            dstTri[1].x = pCutFrImg->width - 1;
            dstTri[1].y = 0;
            dstTri[2].x = 0;
            dstTri[2].y = pCutFrImg->height - 1;
            dstTri[3].x = pCutFrImg->width - 1;
            dstTri[3].y = pCutFrImg->height - 1;
            //获得矩阵
            cvGetPerspectiveTransform(srcTri, dstTri, warp_mat);
            //反透视变换
            cvWarpPerspective(pCutFrame, pCutFrImg, warp_mat);
#endif
            //前景图转换为灰度图
            cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
            //二值化前景图
            cvThreshold(pCutFrImg, pCutFrImg, 80, 255.0, CV_THRESH_BINARY);
            //进行形态学滤波,去掉噪音
            cvErode(pCutFrImg, pCutFrImg, 0, 2);
            cvDilate(pCutFrImg, pCutFrImg, 0, 2);
            //canny变化
            cvCanny(pCutFrImg, pCutFrImg, 50, 120);
            //sobel变化
            //Mat pCutFrMat(pCutFrImg);
            //Sobel(pCutFrMat, pCutFrMat, pCutFrMat.depth(), 1, 1);
            //laplacian变化
            //Laplacian(pCutFrMat, pCutFrMat, pCutFrMat.depth());
#if 1       //0为下面的代码,1为上面的代码
    #pragma region Hough直线检测
            lines = cvHoughLines2(pCutFrImg, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 100, 15, 15);
            printf("Lines number: %d\n", lines->total);
            //画出直线
            for (int i = 0; i<lines->total; i++){
                CvPoint* line = (CvPoint*)cvGetSeqElem(lines, i);
                double k = ((line[0].y - line[1].y)*1.0 / (line[0].x - line[1].x));
                cout<<"nFrmNum "<<nFrmNum<<" 's k = "<<k<<endl;
                if(!(abs(k)<0.1))//去掉水平直线
                    cvLine(pFrame, line[0], line[1], CV_RGB(255, 0, 0), 6, CV_AA);
            }
    #pragma endregion
#else
    #pragma region mylinedetect
            Mat edge(pCutFrImg);
            vector<struct line> lines = detectLine(edge, 60);
            Mat pFrameMat(pFrame);
            drawLines(pFrameMat, lines);
            namedWindow("mylinedetect", 1);
            imshow("mylinedetect", pFrameMat);
    #pragma endregion
#endif
            //恢复ROI区域
            cvResetImageROI(pFrame);
            //写入视频流
            writer << pFrame;
            //显示图像
            cvShowImage("video", pFrame);
            cvShowImage("BWmode", pCutFrImg);
            //按键事件,空格暂停,其他跳出循环
            int temp = cvWaitKey(2);
            if (temp == 32){
                while (cvWaitKey() == -1);
            }
            else if (temp >= 0){
                break;
            }
        }
    }
    //销毁窗口
    cvDestroyWindow("video");
    cvDestroyWindow("BWmode");
    //释放图像
    cvReleaseImage(&pCutFrImg);
    cvReleaseImage(&pCutFrame);
    cvReleaseCapture(&pCapture);

    return 0;
}

mylinedetect.h

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <vector>
#include <cmath>
using namespace cv;
using namespace std;

const double pi = 3.1415926f;
const double RADIAN = 180.0 / pi;

struct line{
    int theta;
    int r;
};

vector<struct line> detectLine(Mat &img, int threshold){
    vector<struct line> lines;
    int diagonal = floor(sqrt(img.rows*img.rows + img.cols*img.cols));
    vector< vector<int> >p(360, vector<int>(diagonal));
    //统计数量
    for (int j = 0; j < img.rows; j++) {
        for (int i = 0; i < img.cols; i++) {
            if (img.at<unsigned char>(j, i) > 0){
                for (int theta = 0; theta < 360; theta++){
                    int r = floor(i*cos(theta / RADIAN) + j*sin(theta / RADIAN));
                    if (r < 0)
                        continue;
                    p[theta][r]++;
                }
            }
        }
    }
    //获得最大值
    for (int theta = 0; theta < 360; theta++){
        for (int r = 0; r < diagonal; r++){
            int thetaLeft = max(0, theta - 1);
            int thetaRight = min(359, theta + 1);
            int rLeft = max(0, r - 1);
            int rRight = min(diagonal - 1, r + 1);
            int tmp = p[theta][r];
            if (tmp > threshold
                && tmp > p[thetaLeft][rLeft] && tmp > p[thetaLeft][r] && tmp > p[thetaLeft][rRight]
                && tmp > p[theta][rLeft] && tmp > p[theta][rRight]
                && tmp > p[thetaRight][rLeft] && tmp > p[thetaRight][r] && tmp > p[thetaRight][rRight]){
                struct line newline;
                newline.theta = theta;
                newline.r = r;
                lines.push_back(newline);
            }
        }
    }
    return lines;
}

void drawLines(Mat &img, const vector<struct line> &lines){
    for (int i = 0; i < lines.size(); i++){
        vector<Point> points;
        int theta = lines[i].theta;
        int r = lines[i].r;

        double ct = cos(theta / RADIAN);
        double st = sin(theta / RADIAN);

        //公式 r = x*ct + y*st
        //计算左边
        int y = int(r / st);
        if (y >= 0 && y < img.rows){
            Point p(0, y);
            points.push_back(p);
        }
        //计算右边
        y = int((r - ct*(img.cols - 1)) / st);
        if (y >= 0 && y < img.rows){
            Point p(img.cols - 1, y);
            points.push_back(p);
        }
        //计算上边
        int x = int(r / ct);
        if (x >= 0 && x < img.cols){
            Point p(x, 0);
            points.push_back(p);
        }
        //计算下边
        x = int((r - st*(img.rows - 1)) / ct);
        if (x >= 0 && x < img.cols){
            Point p(x, img.rows - 1);
            points.push_back(p);
        }
        //画线
        cv::line(img, points[0], points[1], Scalar(255, 0, 0), 5, CV_AA);
    }
}

方法二:

#include<cv.h>
#include<cxcore.h>
#include<highgui.h>

#include<cstdio>
#include<iostream>
using namespace std;

int main(){
    //声明IplImage指针
    IplImage* pFrame = NULL;
    IplImage* pCutFrame = NULL;
    IplImage* pCutFrImg = NULL;
    IplImage* pCutBkImg = NULL;
    //声明CvMat指针
    CvMat* pCutFrameMat = NULL;
    CvMat* pCutFrMat = NULL;
    CvMat* pCutBkMat = NULL;
    //声明CvCapture指针
    CvCapture* pCapture = NULL;
    //声明CvMemStorage和CvSeg指针
    CvMemStorage* storage = cvCreateMemStorage();
    CvSeq* lines = NULL;
    //当前帧数
    int nFrmNum = 0;
    //裁剪的天空高度
    int CutHeight = 250;
    //窗口命名
    cvNamedWindow("video", 1);
    //cvNamedWindow("background", 1);
    cvNamedWindow("foreground", 1);
    //调整窗口初始位置
    cvMoveWindow("video", 300, 30);
    cvMoveWindow("background", 100, 100);
    cvMoveWindow("foreground", 300, 370);
    //不能打开则退出
    if (!(pCapture = cvCaptureFromFile("lane.avi"))){
        fprintf(stderr, "Can not open video file\n");
        return -2;
    }
    //每次读取一桢的视频
    while (pFrame = cvQueryFrame(pCapture)){
        //设置ROI裁剪图像
        cvSetImageROI(pFrame, cvRect(0, CutHeight, pFrame->width, pFrame->height - CutHeight));
        nFrmNum++;
        //第一次要申请内存p
        if (nFrmNum == 1){
            pCutFrame = cvCreateImage(cvSize(pFrame->width, pFrame->height - CutHeight), pFrame->depth, pFrame->nChannels);
            cvCopy(pFrame, pCutFrame, 0);
            pCutBkImg = cvCreateImage(cvSize(pCutFrame->width, pCutFrame->height), IPL_DEPTH_8U, 1);
            pCutFrImg = cvCreateImage(cvSize(pCutFrame->width, pCutFrame->height), IPL_DEPTH_8U, 1);

            pCutBkMat = cvCreateMat(pCutFrame->height, pCutFrame->width, CV_32FC1);
            pCutFrMat = cvCreateMat(pCutFrame->height, pCutFrame->width, CV_32FC1);
            pCutFrameMat = cvCreateMat(pCutFrame->height, pCutFrame->width, CV_32FC1);
            //转化成单通道图像再处理
            cvCvtColor(pCutFrame, pCutBkImg, CV_BGR2GRAY);
            cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
            //转换成矩阵
            cvConvert(pCutFrImg, pCutFrameMat);
            cvConvert(pCutFrImg, pCutFrMat);
            cvConvert(pCutFrImg, pCutBkMat);
        }
        else{
            //获得剪切图
            cvCopy(pFrame, pCutFrame, 0);
            //前景图转换为灰度图
            cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
            cvConvert(pCutFrImg, pCutFrameMat);
            //高斯滤波先,以平滑图像
            cvSmooth(pCutFrameMat, pCutFrameMat, CV_GAUSSIAN, 3, 0, 0.0);
            //当前帧跟背景图相减
            cvAbsDiff(pCutFrameMat, pCutBkMat, pCutFrMat);
            //二值化前景图
            cvThreshold(pCutFrMat, pCutFrImg, 35, 255.0, CV_THRESH_BINARY);
            //进行形态学滤波,去掉噪音
            cvErode(pCutFrImg, pCutFrImg, 0, 1);
            cvDilate(pCutFrImg, pCutFrImg, 0, 1);
            //更新背景
            cvRunningAvg(pCutFrameMat, pCutBkMat, 0.003, 0);
            //pCutBkMat = cvCloneMat(pCutFrameMat);
            //将背景转化为图像格式,用以显示
            //cvConvert(pCutBkMat, pCutBkImg);
            cvCvtColor(pCutFrame, pCutBkImg, CV_BGR2GRAY);
            //canny变化
            cvCanny(pCutFrImg, pCutFrImg, 50, 100);
            #pragma region Hough检测
            lines = cvHoughLines2(pCutFrImg, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 100, 30, 15);
            printf("Lines number: %d\n", lines->total);
            //画出直线
            for (int i = 0; i<lines->total; i++){
                CvPoint* line = (CvPoint* )cvGetSeqElem(lines, i);
                cvLine(pCutFrame, line[0], line[1], CV_RGB(255, 0, 0), 6, CV_AA);
            }
            #pragma endregion
            //显示图像
            cvShowImage("video", pCutFrame);
            cvShowImage("background", pCutBkImg);
            cvShowImage("foreground", pCutFrImg);
            //按键事件,空格暂停,其他跳出循环
            int temp = cvWaitKey(2);
            if (temp == 32){
                while (cvWaitKey() == -1);
            }
            else if (temp >= 0){
                break;
            }
        }
        //恢复ROI区域(多余可去掉)
        cvResetImageROI(pFrame);
    }
    //销毁窗口
    cvDestroyWindow("video");
    cvDestroyWindow("background");
    cvDestroyWindow("foreground");
    //释放图像和矩阵
    cvReleaseImage(&pCutFrImg);
    cvReleaseImage(&pCutBkImg);
    cvReleaseImage(&pCutFrame);
    cvReleaseMat(&pCutFrameMat);
    cvReleaseMat(&pCutFrMat);
    cvReleaseMat(&pCutBkMat);
    cvReleaseCapture(&pCapture);

    return 0;
}
基于OpenCV的车道线检测 本项目主要使用OpenCV库,对视频中的车道线进行识别。通过图像处理技术,实现对车道线的处理、检测,并在视频中准确标记出车道线的位置。实施思路如下:a. 视频处理:读取视频文件,并对视频中的每一帧进行处理。b. 图像转换:将视频帧从彩色模式转换为灰度模式,以便进行后续处理。c. 噪声去除:使用高斯模糊对图像进行去噪,提高边缘检测的准确性。d. 边缘检测:使用Canny算法进行边缘检测,找出图像中的所有边缘。 阅读详情

相关推荐

基于Opencv车道线检测

二值化:先变化为灰度图,然后设定阈值直接变成二值化图像。形态学滤波:对二值化图像进行腐蚀,去除噪点,然后对图像进行膨胀,弥补对车道线的腐蚀。ROI提取:提取感兴趣的ROI边缘线检测:canny变化、sobel变化和laplacian变化中选择了效果比较好的canny变化,三者在代码中均可以使用,canny变化效果稍微好一点。直线检测:Hough直线检测    #include&lt;cv.h&gt...

huhongtao1989的博客 4978

车道线检测相关算法介绍

不同的车道线检测算法有各自的优缺点,需要根据具体的应用场景选择合适的算法。最近,一些新的车道线检测算法也在不断涌现,例如基于多任务学习的算法、基于弱监督学习的算法等,这些算法在提高检测效果的同时,也减少了标注数据的需求。在进行车道线检测时,需要根据具体的应用场景选择合适的算法,并进行组合和优化,以提高检测的准确性和鲁棒性。该算法对光照变化和阴影的影响较小,但对于复杂的道路场景,可能会出现误检测的情况。该算法对于曲线车道线和断断续续的车道线有较好的检测效果,但对于弯曲或变形的车道线可能会出现误检测的情况。

weixin_39223193的博客 2529

Python+OpenCV实现车道线检测代码部分

实验时 使用的是python3.7+cv2,直接在Anaconda上面直接安装,代码在Jupyter上跑的,图片是老师给的(—.—) 经过各个滤波后,划定区域 : 最终合成的图像 : 最后实际上是先把篮框框内的两条线截出来,之后使用最小二乘拟合出两条直线,然后将其与原图合并,形成车道线的检测,当时写这个实验参考了许多优快云上,简书上,知乎上以及Github的一些开源代码,这...

Dr.sen的博客 6896

2022-车道线检测综述

车道线检测综述

u012932320的博客 1万+

使用OpenCV完成车道线检测功能

实验名称:车道线检测 本项目是基于反透视变换和Hough直线检测完成的。要理解反透视变换首先要理解摄像机坐标系,成像坐标系和图像坐标系的关系。 1st. 对原视频进行反透视变换,将视角转变为鸟瞰图。 2nd.对视频进行一些预处理,如腐蚀膨胀,平滑处理等,设置ROI,减少画面中车道线以外的干扰物的影响。 3rd. 进行Canny变换,检测出画面的边缘并且对图像自动进行二值化处理。 4th.所得图像进行Hough变换,通过阀值,线段最短长度,连接为线段的最长间隔的设定来检测出画面中存在的直线。 5th.直线筛选

梦想家林肯 5万+

opencv vs 下 车道线的检测

/*车道线检测,思路: 首先 ,对图像进行平滑处理,然后Canny边缘检测,使用Hough画直线 郭洪成 2015.3.31 */ #include #include #include #include #include #include #include //自定义LINE结构体  //由pt0,pt1两个点连接成一段线段  struct LINE

Frakie_Kwok的专栏 3783

算法类学习笔记 ———— 车道线检测

车道线是用来管制和引导交通的一种标线,由标化于路面上的线条、箭头、文字、标记和轮廓标识等组成。道路交通线又分为指示标线、禁止标线和警告标线。快速、准确地检测车道线在协助智能车辆路径规划和偏移预警等方面尤为重要。目前较为常见的车道线检测方案主要是基于传统计算机视觉地检测,近年出现了基于深度学习的道路特征预测来替代传统方法。同时随着智能交通地逐步发展,基于雷达等高精设备的车道线检测也成为了可能。

永远的菜鸡小詹的博客 5231

基于OpenCV的车道线实时检测系统(源码&教程)

基于OpenCV的车道线实时检测系统(源码&教程)

qunmasj的博客 3266

自动驾驶 | 车道检测实用算法

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者 |Ethon来源|决策智能与机器学习车道识别是自动驾驶领域的一个重要问题,今天介绍一个利用摄像头图像进行车道识别的实用算法。该算法利用了OpenCV库和Udacity自动驾驶汽车数据库的相关内容。该算法包含以下步骤:摄像头校准,以移除镜头畸变(Lens distortion)的影响图像前处理,用于识别车道线道路视角变...

小白学视觉 1658

【Lane Detection】车道线检测的简单实现 (OpenCV)

目录 1 导入工具库,查看图片 2 图片灰度处理 3 Canny边缘检测 4 划定ROI 5 霍夫变换,直线检测 6 直线拟合,根据端点画出左右lane 7 Pipeline搭建 &Video车道检测 8 方法改进 8.1 分别提取yellow pixels(HSV) & white pixels 8.2 高斯模糊(减小噪声) 8.3 ROI 由三角形,改...

qq_43243022的博客 1万+

【Oracle数据库】Oracle11g数据库下载与安装教程(超详细安装图解)

Oracle11g是Oracle公司出的一个比较轻量版的数据库,这里重点说一下在window系统上如何安装Oracle11g, Oracle11g是很早之前的安装包,win7 系统安装时不会遇到环境不满足最低要求的提示,win11系统安装时会提醒环境不满足,修改配置文件即可(注意:先安装oracle服务端/oracle客户端,再安装第三方工具(PL/ SQL Developer,DBeaver等)服务器端环境概述:ORACLE数据库版本:Oracle 11g 64位(11.2.0)

qq_34463511的博客 1万+

基于OpenCV 的车道线检测方法

车道线检测是图像处理运用到无人驾驶的一项技术,目前也过渡到了部分汽车上,高速公路的自动车道保持就是一个应用。 最近研究了两个基于车道检测的opencv的代码,先放链接: A.Udacity车道线检测代码 B.基于霍夫变换和kalman滤波车道线检测 ***A***中处理步骤如下: 1.使用提供的一组棋盘格图片计算相机校正矩阵(camera calibration matrix)和失真系数(...

weixin_40279184的博客 5565

基于Python大数据的智能交通分析系统

该系统能够实时监测交通状况,分析交通流量,预测交通趋势,为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验。它能够为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验,促进交通产业的健康发展。数据采集层:通过传感器、GPS设备、交通摄像头等数据源,实时采集交通数据,如车辆速度、位置、道路拥堵情况等。数据分析层:运用统计学方法、机器学习算法等,对处理后的数据进行深入分析,挖掘交通规律,预测交通趋势。

qq3828614760的博客 2969

基于Python的openCV实现车道线检测算法原理

车道线检测算法的设计与实现 一、问题定义 车道线检测,就是在汽车行驶时通过汽车前方的摄像头捕捉到地面的图像(视频),通过Opencv对图片(视频)进行一系列处理后,可以在图片(视频)中标注出车道线,然后以此作为汽车自动驾驶时的安全行驶范围。由此可见车道线检测是无人驾驶中最为重要且基础的一环。在无人车自动行驶的过程中,实时获取路面视频流,然后对视频进行处理,标注出可行驶的路线。 二、算法...

Dr.sen的博客 1万+

【Ubuntu】SMBus Host controller not enabled(虚拟机进入不了图形界面)

SMBus Host controller not enabled(虚拟机进入不了图形界面)

Cappuccino Blog 4万+

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 199

python opencv车道线检测

python3 opencv车道线检测简介特征提取车道检测鸟瞰图找到车道起点滑动窗口向上扫描多项式拟合鸟瞰图还原到原图评估总结参考 简介 记录一下车道检测的过程。本文使用传统方法对车道线进行检测,主要分为两个部分:特征提取和检测部分。文中提到的方法和所设阈值仅供参考,因为一些参数可能会受数据集和取景角度等一些因素的影响。本文使用的是TUSimple dataset中lane detection的部分数据集。 特征提取 提取sobel在HLS color space中L通道x方向梯度,将像素值在(50,255

weixin_42257677的博客 2750

基于MATLAB的多无人机多任务调度算法——CBBA带时间窗

本文将介绍基于MATLAB的CBBA算法,并对其进行改进,加入时间窗概念,以提高多无人机系统的调度效率和性能。时间窗用于限定任务的执行时间范围,以避免任务执行时间过长或过短导致的问题。具体而言,我们为每个任务设置一个允许的最早开始时间和最晚结束时间,并在任务分配的过程中考虑这些时间约束。在多无人机系统中,需要将若干个任务分配给不同的无人机完成,以实现高效的任务执行。以上是关于基于MATLAB的多无人机多任务调度算法CBBA带时间窗的简要介绍和源代码实现。多无人机系统的调度问题。

BUG?不存在的! 1898

Opencv-Python处理车道线检测

利用Opencv和Python结合完成车道线检测 1 前言 去年对Opencv系统学习了一段时间,后面没有继续更新博客,但自己也有继续学习啦,哈哈,最近做了一个小项目,利用图像处理算法解决车道线检测。但目前自己深知这只是个基础的初级状态,还有很多不足的地方,后面会更新一篇利用深度神经网络完成车道线检测的项目,检测效果比这里要好很多,这里先把图像处理算法的完成流程和经过介绍清楚。 2 项目目标 对一...

live4046的博客 1万+

STM32实现等精度测频

上一章介绍了利用STM32的TIM的捕获功能实现频率测量的方法,但测量误差受被测信号频率的影响,不适合测量频率变化较大的。本章将介绍等精度测频的方法以及STM32的实现。STM3...

zhang062061的专栏 3457

杰理蓝牙SPP用户接口详细文档

本文档详细介绍了基于JL701n芯片的蓝牙SPP用户接口实现。主要内容包括:1) 文件结构分析,包含必要的头文件和调试配置;2) 核心数据结构,如全局变量和TWS功能ID定义;3) 五大功能模块实现:数据发送、状态管理、数据接收、TWS支持和初始化清理;4) API接口说明,包括公共接口函数和回调函数;5) 使用教程,涵盖基本流程和高级应用示例。该接口支持虚拟串口连接,实现蓝牙设备间数据传输,特别针对TWS场景进行了优化,提供连接状态管理、数据收发等功能。文档还包含错误处理、重试机制等实用建议,适合蓝牙SP

qq_42014563的博客 1180

OpenCV的车道线检测

final_mark.py是最终,前面的都是一部分一部分测试的功能,用的是霍夫变换拟合,测试视频附在压缩文件中。

毕业作品网站 6032

跨平台C#上位机开发:.NET MAUI与工业物联网的融合实战

NET MAUI正在重塑工业上位机的开发模式——从“为单一设备定制”转向“全场景覆盖”。其价值不仅在于“代码复用”,更在于打通了工业物联网的“最后一公里”:让边缘设备、云平台、移动终端通过统一的数据模型协同工作。未来,随着.NET MAUI对WebAssembly的支持(计划在.NET 9实现),上位机甚至可直接运行在浏览器中,进一步降低部署门槛。对于工业开发者,掌握跨平台技术意味着能更快响应多样化的现场需求,从“Windows专家”升级为“全栈工业开发者”。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1091

基于opencv-python的车道线检测(高级)

运行环境:python3.8, numpy=1.19.5,opencv-python=4.5.1 注意:以下内容只提供了代码与运行结果,具体原理与细节见https://zhuanlan.zhihu.com/p/54866418 一、文章目录 1、相机标定 2、视频畸形修正 3、透视变换 4、提取车道线 5、矩形滑窗 6、跟踪车道线 7、求取曲率与偏移量 8、逆投影到原图 9、视频车道线检测 二、实操 注意:后一节代码是在上一节代码的基础上进行修改(排版比较繁琐,可以选择章节进行运行) 1、相机标定 impo

weixin_45679938的博客 9570

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Dlib+OpenCV深度学习人脸识别
下一篇: Hough变换原始形式-直线检测
csdnall
博客等级 码龄10年 30粉丝 2原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值