成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenCvSharp實戰:C#交通信號燈識別系統詳解

開發 前端
本文詳細介紹了如何使用OpenCvSharp在C#環境下實現交通信號燈識別系統。從基礎的環境搭建到完整的代碼實現,再到系統優化與常見問題解決方案,全面覆蓋了開發過程中的關鍵環節。

在智能交通系統領域,交通信號燈識別是一項基礎且關鍵的技術。借助OpenCvSharp庫,C#開發者可以快速構建高效準確的交通信號識別系統。本文將詳細介紹如何使用OpenCvSharp在C#環境下實現交通信號燈的自動識別,提供完整代碼示例和詳細注釋,助力開發者快速掌握這一技術。

OpenCvSharp簡介

OpenCvSharp是一個OpenCV的.NET封裝庫,它允許.NET開發者使用C#等語言調用OpenCV的強大功能。相比于其他封裝庫,OpenCvSharp具有以下優勢:

  • 接口設計符合C#風格,使用更加自然
  • 完整支持OpenCV的主要功能
  • 性能損耗小,接近原生C++版本
  • 文檔完善,社區活躍

環境搭建

安裝必要組件 

首先,我們需要通過NuGet包管理器安裝OpenCvSharp:

// 在Visual Studio中,通過NuGet包管理器安裝以下包:
// OpenCvSharp4
// OpenCvSharp4.runtime.win

或者在項目文件中添加:

<PackageReference Include="OpenCvSharp4" Version="4.7.0.20230115" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.7.0.20230115" />

交通信號燈識別原理

交通信號燈識別主要分為以下幾個步驟:

  1. 圖像預處理:調整大小、降噪、增強對比度
  2. 顏色空間轉換:從BGR轉到HSV顏色空間,便于顏色識別
  3. 顏色閾值分割:提取紅、黃、綠三種顏色區域
  4. 形狀識別:識別圓形區域,確定信號燈位置
  5. 結果分析:根據顏色和位置判斷信號燈狀態

完整代碼實現

下面是一個完整的交通信號燈識別系統的實現:

using OpenCvSharp;

namespace AppTrafficLight
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 圖像路徑  
            string imagePath = "traffic_light.jpg";

            // 讀取圖像  
            using (Mat src = Cv2.ImRead(imagePath))
            {
                if (src.Empty())
                {
                    Console.WriteLine("無法讀取圖像!");
                    return;
                }

                // 顯示原始圖像  
                using (new Window("原始圖像", src))
                {
                    // 調整圖像大小以加快處理速度  
                    Mat resized = new Mat();
                    Cv2.Resize(src, resized, new Size(0, 0), 0.5, 0.5);

                    // 進行高斯模糊以減少噪聲  
                    Mat blurred = new Mat();
                    Cv2.GaussianBlur(resized, blurred, new Size(5, 5), 0);

                    // 轉換到HSV顏色空間  
                    Mat hsv = new Mat();
                    Cv2.CvtColor(blurred, hsv, ColorConversionCodes.BGR2HSV);

                    // 定義紅、黃、綠三種顏色的HSV范圍  
                    // 注意:紅色在HSV中橫跨兩個區間,需要兩個范圍  

                    // 紅色范圍1(0-10)  
                    Scalar redLower1 = new Scalar(0, 100, 100);
                    Scalar redUpper1 = new Scalar(10, 255, 255);

                    // 紅色范圍2(160-180)  
                    Scalar redLower2 = new Scalar(160, 100, 100);
                    Scalar redUpper2 = new Scalar(180, 255, 255);

                    // 黃色范圍  
                    Scalar yellowLower = new Scalar(15, 100, 100);
                    Scalar yellowUpper = new Scalar(30, 255, 255);

                    // 綠色范圍  
                    Scalar greenLower = new Scalar(75, 50, 50);
                    Scalar greenUpper = new Scalar(95, 255, 255);

                    // 創建掩碼  
                    Mat redMask1 = new Mat();
                    Mat redMask2 = new Mat();
                    Mat redMask = new Mat();
                    Mat yellowMask = new Mat();
                    Mat greenMask = new Mat();

                    // 應用閾值,提取各個顏色區域  
                    Cv2.InRange(hsv, redLower1, redUpper1, redMask1);
                    Cv2.InRange(hsv, redLower2, redUpper2, redMask2);
                    Cv2.BitwiseOr(redMask1, redMask2, redMask); // 合并兩個紅色區間  
                    Cv2.InRange(hsv, yellowLower, yellowUpper, yellowMask);
                    Cv2.InRange(hsv, greenLower, greenUpper, greenMask);

                    // 顯示各顏色掩碼  
                    using (new Window("紅色掩碼", redMask))
                    using (new Window("黃色掩碼", yellowMask))
                    using (new Window("綠色掩碼", greenMask))
                    {
                        // 對每個掩碼應用形態學操作以去除噪聲  
                        Mat kernel = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(5, 5));

                        Cv2.MorphologyEx(redMask, redMask, MorphTypes.Open, kernel);
                        Cv2.MorphologyEx(yellowMask, yellowMask, MorphTypes.Open, kernel);
                        Cv2.MorphologyEx(greenMask, greenMask, MorphTypes.Open, kernel);

                        // 尋找輪廓  
                        Point[][] redContours, yellowContours, greenContours;
                        HierarchyIndex[] redHierarchy, yellowHierarchy, greenHierarchy;

                        Cv2.FindContours(redMask, out redContours, out redHierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
                        Cv2.FindContours(yellowMask, out yellowContours, out yellowHierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
                        Cv2.FindContours(greenMask, out greenContours, out greenHierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);

                        // 創建結果圖像  
                        Mat result = resized.Clone();

                        // 處理并繪制紅色信號  
                        ProcessContours(result, redContours, "Red", new Scalar(0, 0, 255));

                        // 處理并繪制黃色信號  
                        ProcessContours(result, yellowContours, "Yellow", new Scalar(0, 255, 255));

                        // 處理并繪制綠色信號  
                        ProcessContours(result, greenContours, "Green", new Scalar(0, 255, 0));

                        // 顯示結果  
                        using (new Window("識別結果", result))
                        {
                            Cv2.WaitKey(0);
                        }
                    }
                }
            }
        }

        /// <summary>  
        /// 處理輪廓并繪制識別結果  
        /// </summary>  
        /// <param name="image">要繪制的圖像</param>  
        /// <param name="contours">輪廓數組</param>  
        /// <param name="label">標簽文本</param>  
        /// <param name="color">繪制顏色</param>  
        static void ProcessContours(Mat image, Point[][] contours, string label, Scalar color)
        {
            foreach (var contour in contours)
            {
                // 計算輪廓面積  
                double area = Cv2.ContourArea(contour);

                bool isValidArea = false;
                isValidArea = area > 3000;

                // 忽略小面積噪點  
                if (!isValidArea) continue;

                // 獲取最小外接圓  
                Point2f center;
                float radius;
                Cv2.MinEnclosingCircle(contour, out center, out radius);

                // 計算輪廓矩  
                Moments moments = Cv2.Moments(contour);

                // 計算輪廓中心點  
                int cx = (int)(moments.M10 / moments.M00);
                int cy = (int)(moments.M01 / moments.M00);

                // 如果輪廓接近圓形  
                double circleArea = Math.PI * radius * radius;
                double areaRatio = area / circleArea;

                if (areaRatio > 0.6) // 如果面積比超過60%,認為是圓形  
                {
                    // 繪制圓和中心點  
                    Cv2.Circle(image, (int)center.X, (int)center.Y, (int)radius, color, 2);
                    Cv2.Circle(image, cx, cy, 5, new Scalar(255, 255, 255), -1);

                    // 繪制標簽  
                    Cv2.PutText(image, label, new Point(cx - 20, cy - 20),
                                HersheyFonts.HersheySimplex, 0.5, color, 2);

                    // 輸出信息  
                    Console.WriteLine($"檢測到{label}: 位置({cx},{cy}), 半徑: {radius}, 面積: {area}");
                }
            }
        }
    }
}

總結

本文詳細介紹了如何使用OpenCvSharp在C#環境下實現交通信號燈識別系統。從基礎的環境搭建到完整的代碼實現,再到系統優化與常見問題解決方案,全面覆蓋了開發過程中的關鍵環節。通過這套系統,開發者可以快速構建出準確可靠的交通信號識別應用,為智能交通系統、自動駕駛等領域提供基礎支持。

責任編輯:武曉燕 來源: 技術老小子
相關推薦

2017-04-12 13:31:58

智能紅綠燈邁阿密交通

2021-06-01 09:39:58

智能交通物聯網IOT

2020-06-10 07:59:44

漏洞攻擊黑客

2020-07-08 15:15:03

AndoridGoogle交通信號燈

2020-12-24 10:09:19

人工智能AI智能交通

2021-10-09 13:55:24

谷歌交通信號燈人工智能

2021-04-09 10:50:22

人工智能AI智能交通

2021-03-23 15:01:09

鴻蒙HarmonyOS應用開發

2014-06-10 10:47:37

2023-09-11 12:36:56

研究數據

2023-06-29 14:43:32

2017-09-11 20:15:28

智慧交通視頻監控云平臺

2024-03-18 09:54:32

開源AI模型

2009-01-18 09:31:00

網絡故障網卡信號燈

2023-08-15 14:31:46

2009-08-25 17:24:55

C#串口通信程序

2018-06-26 10:12:41

華為

2022-09-18 21:39:42

自動駕駛識別
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一卡二卡三卡 | 在线区| 色www精品视频在线观看 | 国产成人一区二 | 午夜精品久久久久久久99黑人 | 亚洲欧洲在线看 | 亚洲人成网站777色婷婷 | 国产乱码精品一区二区三区五月婷 | 伦理片97 | 亚洲 中文 欧美 日韩 在线观看 | 久久精选| 日韩精品一区二区三区中文在线 | 国产一区二区三区日韩 | 一区二区三区四区毛片 | 亚洲啊v| 久久精品久久久久久 | 欧美成人一区二区三区 | 91婷婷韩国欧美一区二区 | 国产视频一区二区三区四区五区 | 久草在线影 | 久久极品 | h漫在线观看 | 午夜午夜精品一区二区三区文 | 性xxxxx| 久久99精品久久久久 | 中文字幕第三页 | 欧美激情一区二区三区 | aaa综合国产 | 亚洲狠狠爱 | 欧美成人精品在线 | 久久a久久 | 黄网站在线播放 | 成人综合在线视频 | 国精产品一品二品国精在线观看 | 中文字幕一区二区三区乱码在线 | 亚洲视频在线免费观看 | www.日本三级| 亚洲一区在线免费观看 | 亚洲网在线| 欧美日韩在线高清 | 伊人99 |