車道保持中車道線識別

需要讓小車保持車道行駛,首先需要進行車道線識別。

也可參看論文(上傳到資源里):自動駕駛汽車車道檢測與預測的技術解析-基于圖像處理和Hough變換的方法

1 車道識別流程

想進行車道線識別,并且希望在圖像中選擇一個特定的區域進行處理(例如只處理道路區域),可以通過以下步驟對代碼進行修改。我們將使用 ROI(Region of Interest)來限制處理范圍,并優化車道線檢測的邏輯。

具體步驟:

  1. ROI(Region of Interest):

    • 使用?roi?變量定義感興趣區域,格式為?[x, y, width, height]

    • 通過?roiFrame = frame(roi(2):roi(2)+roi(4), roi(1):roi(1)+roi(3), :)?提取 ROI 區域。

  1. 高斯濾波:

    • 使用?imgaussfilt?對灰度圖像進行高斯濾波,以減少噪聲。

  2. Canny 邊緣檢測:

    • 使用?edge?函數進行 Canny 邊緣檢測,閾值范圍為?[0.1, 0.2],可以根據實際情況調整。

  1. 霍夫變換:

    • 使用?hough?和?houghpeaks?檢測直線。

    • 使用?houghlines?提取直線,并設置?FillGap?和?MinLength?參數以過濾短線段。

  1. 坐標轉換:

    • 將 ROI 中的直線坐標轉換回原圖坐標,以便在原圖上繪制檢測到的車道線。

  2. 繪制車道線:

    • 使用?plot?函數在原圖上繪制檢測到的車道線。

2 代碼

?2.1 實現 車道識別

% 創建一個圖形窗口
figure;% 定義 ROI(Region of Interest)
roi = [200, 200, 400, 200]; % [x, y, width, height],根據你的圖像調整% 循環處理每一幀
% while(vid.FramesAcquired <= 1000) % 處理1000幀% 獲取一幀圖像
%     frame = getsnapshot(vid);frame=imread('test.png');imagesc(frame)title('測試圖')% 提取 ROI 區域%roiFrame = frame(roi(2):roi(2)+roi(4), roi(1):roi(1)+roi(3), :);shape=size(pic);%圖片大小
roi(1)=0.5*shape(1); %x  寬度
roi(2)=0.4*shape(2);%高度 yroiFrame = frame(roi(1) :1*shape(1),roi(2):1*shape(2) ,:);  % 轉換為灰度圖像grayFrame = rgb2gray(roiFrame);imshow(grayFrame)title('grayframe 感興趣的區域大小')% 使用高斯濾波去噪filteredFrame = imgaussfilt(grayFrame, 2);% 使用Canny邊緣檢測edges = edge(filteredFrame, 'Canny', [0.05 0.35]);% 使用霍夫變換檢測直線[H, T, R] = hough(edges);P = houghpeaks(H, 5, 'threshold', ceil(0.3 * max(H(:))));lines = houghlines(edges, T, R, P, 'FillGap', 4, 'MinLength', 5);% 在原圖上繪制檢測到的直線imshow(frame); hold on;for k = 1:length(lines)% 將 ROI 中的坐標轉換回原圖坐標xy = [lines(k).point1; lines(k).point2];xy(:, 1) = xy(:, 1) + roi(2); % 調整 x 坐標xy(:, 2) = xy(:, 2) + roi(1); % 調整 y 坐標% 繪制直線plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'green');endhold off;% 刷新圖形窗口drawnow;
% end

2.2 結果

識別的車道線

2.3 車道線合并

? 這里需要考慮相鄰測線合并的問題。

在車道線檢測中,如果遇到相鄰車道線(例如左車道線和右車道線),霍夫變換可能會檢測到多條線段。如果不加以區分,這些線段可能會被錯誤地合并為一條車道線。為了解決這個問題,我們需要對檢測到的線段進行分類和過濾,確保只保留當前車道的車道線。

% 假設 lines 是 houghlines 函數返回的線段結構體
% lines 包含以下字段:point1, point2, theta, rho% 合并線段的閾值
angleThreshold = 5; % 角度閾值(度)
distanceThreshold = 20; % 距離閾值(像素)% 初始化合并后的線段列表
mergedLines = [];% 遍歷所有線段
for i = 1:length(lines)currentLine = lines(i);isMerged = false;% 遍歷已合并的線段列表,檢查是否可以合并for j = 1:length(mergedLines)mergedLine = mergedLines(j);% 計算兩條線段的角度差angleDiff = abs(currentLine.theta - mergedLine.theta);% 計算兩條線段的距離差(使用 rho 值)distanceDiff = abs(currentLine.rho - mergedLine.rho);% 如果角度和距離差都在閾值內,則合并線段if angleDiff < angleThreshold && distanceDiff < distanceThreshold% 合并線段:取兩個端點的最小和最大坐標mergedLine.point1 = min(currentLine.point1, mergedLine.point1);mergedLine.point2 = max(currentLine.point2, mergedLine.point2);% 更新合并后的線段mergedLines(j) = mergedLine;isMerged = true;break;endend% 如果當前線段沒有合并到任何線段中,則添加到合并列表if ~isMergedmergedLines = [mergedLines; currentLine];end
end% 區分左車道線和右車道線
leftLines = [];
rightLines = [];for k = 1:length(mergedLines)line = mergedLines(k);% 計算線段的中點midPoint = (line.point1 + line.point2) / 2;% 根據線段的角度和中點位置分類if line.theta < 0 % 左車道線通常具有負角度leftLines = [leftLines; line];elseif line.theta > 0 % 右車道線通常具有正角度rightLines = [rightLines; line];end
end% 選擇最接近圖像中心的左車道線和右車道線
imageCenterX = size(frame, 2) / 2; % 圖像的水平中心
minLeftDistance = inf;
minRightDistance = inf;
selectedLeftLine = [];
selectedRightLine = [];% 選擇最接近圖像中心的左車道線
for i = 1:length(leftLines)line = leftLines(i);midPoint = (line.point1 + line.point2) / 2;distance = abs(midPoint(1) - imageCenterX);if distance < minLeftDistanceminLeftDistance = distance;selectedLeftLine = line;end
end% 選擇最接近圖像中心的右車道線
for i = 1:length(rightLines)line = rightLines(i);midPoint = (line.point1 + line.point2) / 2;distance = abs(midPoint(1) - imageCenterX);if distance < minRightDistanceminRightDistance = distance;selectedRightLine = line;end
end% 繪制選定的左車道線和右車道線
figure;
imagesc(frame); hold on;
if ~isempty(selectedLeftLine)xy = [selectedLeftLine.point1; selectedLeftLine.point2];xy(:, 1) = xy(:, 1) + roi(2); % 調整 x 坐標xy(:, 2) = xy(:, 2) + roi(1); % 調整 y 坐標plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'blue');
end
if ~isempty(selectedRightLine)xy = [selectedRightLine.point1; selectedRightLine.point2];xy(:, 1) = xy(:, 1) + roi(2); % 調整 x 坐標xy(:, 2) = xy(:, 2) + roi(1); % 調整 y 坐標plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'red');
end%計算中心線hold off;

代碼說明

  1. 線段分類:

    • 根據線段的角度 (theta) 和中點位置,將線段分為左車道線和右車道線。

    • 左車道線通常具有負角度,右車道線通常具有正角度。

  2. 選擇最接近圖像中心的車道線:

    • 計算每條線段的中點,并選擇最接近圖像水平中心的左車道線和右車道線。

    • 這樣可以避免選擇相鄰車道的車道線。

  3. 繪制車道線:

    • 使用藍色繪制左車道線,紅色繪制右車道線。


參數調整建議

  • 角度分類閾值:

    • 如果車道線的角度分布不明顯,可以調整角度分類的閾值。

    • 例如,將左車道線的角度范圍設置為?-90° 到 -10°,右車道線的角度范圍設置為?10° 到 90°

  • 圖像中心范圍:

    • 如果車道線距離圖像中心較遠,可以適當增加選擇車道線的范圍。

優化方向:

  1. 動態角度分類:

    • 根據車道線的實際分布動態調整角度分類的閾值。

  2. 車道線擬合:

    • 使用多項式擬合(如二次曲線)對選定的車道線進行平滑處理。

  3. 多車道處理:

    • 如果需要檢測多車道,可以根據距離和角度進一步分類車道線。

合并結果

3 相機坐標轉換

? 后續就需要對車道線進行坐標轉換,轉為車輛坐標系。

相機標定:相機掛在小車上,用棋盤格標定。

下載30mm*30mm棋盤格進行標定 。

參考書籍:Zhengyou Zhang, A Flexible New Technique for Camera Calibration, 掌握標定原理。

待續!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

英偉達有哪些支持AI繪畫的 工程

英偉達在AI繪畫領域布局廣泛&#xff0c;其自研工具與第三方合作項目共同構建了完整的技術生態。以下是其核心支持AI繪畫的工程及合作項目的詳細介紹&#xff1a; 一、英偉達自研AI繪畫工具 1. GauGAN系列 技術特點&#xff1a;基于生成對抗網絡&#xff08;GAN&#xff09;&…

驅動開發的引入

1.引入 Linux內核的整體架構本就非常龐大&#xff0c;其包含的組件也非常多。而我們怎樣把需要的部分都包含在內核中呢? 一種方法是把所有需要的功能都編譯到Linux內核中。這會導致兩個問題&#xff0c;一是生成的內核會很大&#xff0c;二是如果我們要在現有的內核中新增或刪…

AI日報 - 2025年3月24日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架構效率驚人 在100生物任務中達最優&#xff0c;推理速度提升高達12萬倍 ▎&#x1f4bc; 商業動向 | OpenAI用戶破4億&#xff0c;Meta與Reliance探討AI合作 生態擴展與全…

VMware上對CentOS7虛擬機進行磁盤擴容、縮容

在VMware 17 Pro上對CentOS 7虛擬機進行磁盤擴容&#xff0c;同時保證原先部署的軟件正常使用&#xff0c;可以按照以下步驟進行操作&#xff1a; 一、擴容 步驟一&#xff1a;關閉虛擬機并在VMware中擴展磁盤容量 關閉虛擬機&#xff1a;在VMware Workstation 17 Pro中&…

.gitignore使用指南

.gitignore使用指南 目錄 什么是.gitignore為什么需要.gitignore如何創建.gitignore文件.gitignore文件的語法規則 忽略單個文件忽略目錄忽略特定類型的文件不忽略特定文件或目錄遞歸匹配 示例.gitignore文件注意事項更多特殊場景匹配規則 忽略多個特定后綴的文件忽略特定目錄…

OpenCV旋轉估計(3)幫助構建一個最大生成樹(Maximum Spanning Tree)函數findMaxSpanningTree()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::findMaxSpanningTree 是 OpenCV 中用于圖像拼接工作流的一個函數&#xff0c;它幫助構建一個最大生成樹&#xff08;Maximum Spanni…

Android在kts中簡單使用AIDL

Android在kts中簡單使用AIDL AIDL相信做Android都有所了解&#xff0c;跨進程通信會經常使用&#xff0c;這里就不展開講解原理跨進程通信的方式了&#xff0c;最近項目換成kts的方式&#xff0c;于是把aidl也換成了統一的方式&#xff0c;其中遇到了很多問題&#xff0c;這里…

論文閱讀:2024-NAACL Semstamp、2024-ACL (Findings) k-SemStamp

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Semstamp: A semantic watermark with paraphrastic robustness for text generation https://aclanthology.org/2024.naacl-long.226/ k-SemStamp: A Clustering-Based Semantic Wate…

物化視圖詳解:數據庫性能優化的利器

物化視圖&#xff08;Materialized View&#xff09;作為數據庫性能優化的核心手段&#xff0c;通過預計算和存儲查詢結果&#xff0c;顯著提升了復雜查詢的效率。本文將深入剖析物化視圖的工作原理、應用場景及最佳實踐&#xff0c;幫助企業在合適的場景中充分發揮其性能優勢。…

快速入手:Nacos融合SpringCloud成為注冊配置中心

快速入手&#xff1a;Nacos融合SpringCloud成為注冊配置中心 前言安裝Nacos項目搭建添加配置啟動類添加注解運行項目服務調用RestTemplate 模式FeignClient 模式 Gateway 網關 前言 Spring Cloud是一系列框架的集合&#xff0c;提供了微服務架構下的各種解決方案&#xff0c;如…

2025年2月-3月后端go開發找工作感悟

整體感悟 目標 找工作首先要有一個目標&#xff0c;這個目標盡可能的明確&#xff0c;比如我要字節、拼多多之類的公司&#xff0c;還是要去百度、滴滴這樣的&#xff0c;或者目標是創業公司。但是這個目標是會動態調整的&#xff0c;有可能我們的心態發生了變化&#xff0c;一…

Python | 如何在Pandas中刪除常量列

在數據分析中&#xff0c;經常會遇到數據集中始終具有常量值的列&#xff08;即&#xff0c;該列中的所有行包含相同的值&#xff09;。這樣的常量列不提供有意義的信息&#xff0c;可以安全地刪除而不影響分析。 如&#xff1a; 在本文中&#xff0c;我們將探索如何使用Pyth…

5.高頻加熱的原理與常用集成電路介紹

一、高頻加熱的類型 利用高頻電源加熱通常由兩種方法&#xff1a;電介質加熱&#xff08;被加熱物體絕緣&#xff09;與感應加熱&#xff08;被加熱物體導電&#xff09;&#xff0c;詳細解釋如下&#xff1a; 電介質加熱&#xff08;利用高頻電壓的高頻電場導致物體自身分子摩…

串口通信與Modbus通信的區別和聯系

一、定義與定位 1?、串口通信? 是物理層的硬件接口標準&#xff0c;用于實現設備間的?串行數據傳輸?&#xff0c;常見類型包括RS-232、RS-485和RS-422?35。其功能是完成并行數據與串行信號的轉換&#xff0c;并定義電氣特性&#xff08;如電平、傳輸速率&#xff09;?。…

Linux生產者消費者模型

Linux生產者消費者模型 Linux生產者消費者模型詳解生產者消費者模型生產者消費者模型的概念生產者消費者模型的特點生產者消費者模型優點 基于BlockingQueue的生產者消費者模型基于阻塞隊列的生產者消費者模型模擬實現基于阻塞隊列的生產消費模型基礎實現生產者消費者步調調整條…

【中文翻譯】第9章-The Algorithmic Foundations of Differential Privacy

由于GitHub項目僅翻譯到前5章&#xff0c;我們從第6章開始通過大語言模型翻譯&#xff0c;并導出markdown格式。 大模型難免存在錯漏&#xff0c;請讀者指正。 教材原文地址&#xff1a;https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf 9 差分隱私與計算復雜度 到目…

【AI大模型】搭建本地大模型GPT-NeoX:詳細步驟及常見問題處理

搭建本地大模型GPT-NeoX:詳細步驟及常見問題處理 GPT-NeoX是一個開源的大型語言模型框架,由EleutherAI開發,可用于訓練和部署類似GPT-3的大型語言模型。本指南將詳細介紹如何在本地環境中搭建GPT-NeoX,并解決過程中可能遇到的常見問題。 1. 系統要求 1.1 硬件要求 1.2 軟…

Unity跨平臺構建快速回顧

知識點來源&#xff1a;人間自有韜哥在&#xff0c;豆包 目錄 一、發布應用程序1. 修改發布必備設置1.1 打開設置面板1.2 修改公司名、游戲項目名、版本號和默認圖標1.3 修改 Package Name 和 Minimum API Level 2. 發布應用程序2.1 配置 Build Settings2.2 選擇發布選項2.3 構…

低配電腦暢玩《怪物獵人:荒野》,ToDesk云電腦優化從30幀到144幀?

《怪物獵人&#xff1a;荒野&#xff08;Monster Hunter Wilds&#xff09;》自2025年正式發售以來已取得相當亮眼的成績&#xff0c;僅用三天時間便輕松突破800萬銷量&#xff0c;目前順利蟬聯周榜冠軍&#xff1b;憑借著開放世界的宏大場景和豐富的狩獵玩法&#xff0c;該游戲…

Flink基礎簡介和安裝部署

文章目錄 一、Flink基礎簡介1、什么是Flink2、Flink流處理特性3、Flink四大基石4、Flink中的角色 二、Flink集群搭建1、Local模式①上傳Flink安裝包②啟動交互窗口③提交任務測試④訪問WebUI頁面查看④退出停止集群 一、Flink基礎簡介 1、什么是Flink Flink是?個分布式&#…