opencv-C++ 进行仪表盘识别

因为C++继承了C语言的所有优点,并且能在面向对象编程的同时保留了高效、简洁的语法特性,并且它还具有执行效率的优势,对接受的命令能做出快速响应。因此,它被广泛应用于工业,桌面应用开发等场景。所以,我这次分享一下使用opencv-C++库对仪表盘进行识别。

环境搭建

首当其冲的自然是分享一下对环境的搭建,希望大家能搭建顺利吖;

该环境搭建主要分三步:

makefile 复制代码
step1:下载opencv库;
step2:下载文件并将库加入环境变量;
step3:添加项目依赖;

S1:下载库文件可到官网地址Releases - OpenCV中下载,选择最新版下载以及系统即可(需要科学上网,不然会出现下载半天的情况)

S2:下载库文件并记住下载位置,将opencv\build\x64\vc16\bin路径复制到电脑环境变量中

S3:对于项目搭建,我使用的是Visual Studio,该编辑器能避免很多环境搭建的烦恼,所以只针对该编辑器进行分享。

S3.1:创建C++项目;

S3.2:将库目录引入项目属性表;

点击项目->属性 将opencv\build\include和opencv\build\include\opencv2放入包含目录 opencv\build\X64\vc16\lib放入库目录

opencv-world480_lib加入输入附加依赖项,此时调试器需为release,调试器为debug时改为opencv-world480d_lib(根据自己 opencv\build\X64\vc16\lib中文件适当修改依赖名)

S3.3:测试一下:

arduino 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
​
using namespace cv;
using namespace std;
​
int main(int argc, char** argv) {
    Mat src = imread(" ");//读取图片
    if (src.empty()) {
        printf("img load failed");
        return -1;
    }
    imshow("result", src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

仪表盘识别

与上两篇文章相同,使用了模版匹配,霍夫圈变换,霍夫线变换的方法进行仪表盘识别,经过识别,就能得出指针,零刻度以及表盘区域了。

模版匹配
ini 复制代码
            cv::matchTemplate(img, tempImage, result, cv::TM_CCORR_NORMED);//可以修改为自己的匹配方法
            double minVal, maxVal;
            cv::Point minLoc, maxLoc;
            cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
​
            cv::Point top_left;
            cv::Point zero;
            if (cv::TM_CCORR_NORMED == cv::TM_SQDIFF || cv::TM_CCORR_NORMED == cv::TM_SQDIFF_NORMED) {
                top_left = minLoc;
            }
            else {
                top_left = maxLoc;
                cv::Point bottom_right(top_left.x + w, top_left.y + h);
                zero.x = (top_left.x + bottom_right.x) / 2;
                zero.y = (top_left.y + bottom_right.y) / 2;
                cv::circle(img, zero, 5, cv::Scalar(0, 0, 255), -1);
            }
霍夫圈变换
css 复制代码
            cv::Mat gray;
            cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
            cv::GaussianBlur(gray, gray, cv::Size(3, 3), 0);
​
            std::vector<cv::Vec3f> circles;
            cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, 500, 100, 50, 400, 700);
 //HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,
 //            double param1 = 100, double param2 = 100,int minRadius = 0, int maxRadius = 0 );
 //参数较Python库的函数多了输出数组circle,不会参数的可以看看我的上篇文章https://juejin.cn/post/7342339440553279551
            if (!circles.empty()) {
                for (const auto& circle : circles) {
                    cv::Point center(cvRound(circle[0]), cvRound(circle[1]));
                    int radius = cvRound(circle[2]);
                    cv::circle(img, center, radius, cv::Scalar(0, 0, 255), 1);
                    center2.x = center.x - 25;
                    center2.y= center.y + 55;
                    cv::circle(img, center2, 5, cv::Scalar(0, 0, 255), -1);
                }
            }
霍夫线变换
arduino 复制代码
            cv::Mat edges;
            cv::Canny(img, edges, 200, 300, 3);
            // 检测线段
            std::vector<cv::Vec4i> lines;
            cv::HoughLinesP(edges, lines, 0.9, CV_PI / 180, 86, 35, 40);

            if (!lines.empty()) {
                for (const auto& line : lines) {
                    cv::line(img, Point(line[0], line[1]), Point(line[2] , line[3] ), Scalar(0, 0, 255), 5);
                }
              }

下面附上最终效果图:

总结一下,这次使用了opencv-C++库进行仪表盘的识别,保证了检测速度,能满足简单的仪表盘识别任务,下次我将分享一下存在遮挡的仪表盘识别,期待一下吧。

相关推荐
Joy T几秒前
Spring AI 2.0 进阶入门:RAG、Structured Output 与 Agent 信息闭环
java·人工智能·spring·rag·springai·agent入门
raindayinrain3 分钟前
c++并发--原子操作,内存顺序,屏障
c++·原子操作·操作顺序
skywalk81635 分钟前
第 23 轮方向确定:保护表通用化替代轮。先深入探查剩余保护表依赖场景和任务 6 的四阶段路径,再写任务书。9.14
开发语言·人工智能·光明
深海鱼在掘金9 分钟前
深入浅出RAG——第11章:Prompt 工程与上下文优化
人工智能
华清远见成都中心9 分钟前
OpenCV中颜色空间有哪些区别
人工智能·opencv
做萤石二次开发的哈哈12 分钟前
视频汇集平台模板上线萤石蓝海AIoT一站式工作台:多品牌摄像机+NVR统一接入,GB/T28181国标级联实现工程施工多方视频调度(附部署教程)
大数据·人工智能·物联网·音视频·萤石开放平台·蓝海aiot一站式工作台·aiot开发
张小姐的猫15 分钟前
【AI大模型接入SDK】 —— SQLite上手
linux·开发语言·c++·人工智能·python·log4j
AI深栈15 分钟前
第 9 章 · Model Context Protocol(MCP)
java·人工智能
陈嘿萌17 分钟前
ECCV 2026|MAVFusion:运动感知稀疏交互驱动的高效红外-可见光视频融合
人工智能·计算机视觉·图像融合·佛山大学·学术研究与理论基础·eccv2026
俊哥V18 分钟前
每日 AI 研究简报 · 2026-09-14
人工智能·ai