opencv的使用

1、Qt+opencv 环境搭建

opencv下载:https://opencv.org/releases/
基于QT+cmake编译MinGW版本opencv
QT中使用OpenCV保姆级教程(含编译opencv)
Windows上Qt配置OpenCV(最简单版本无需自己编译-避坑必看)

在 Qt 项目的 .pro 文件中添加以下配置:

cpp 复制代码
# 添加 OpenCV 头文件路径
INCLUDEPATH += C:/Users/RTT/Desktop/flechazo/02_project/00_flechazo/opencv/opencv/install/include
​
# 添加 OpenCV 库文件路径
LIBS += -LC:/Users/RTT/Desktop/flechazo/02_project/00_flechazo/opencv/opencv/install/x64/mingw/lib \
    -lopencv_calib3d4110 \
    -lopencv_core4110 \
    -lopencv_dnn4110 \
    -lopencv_features2d4110 \
    -lopencv_flann4110 \
    -lopencv_highgui4110 \
    -lopencv_imgcodecs4110 \
    -lopencv_imgproc4110 \
    -lopencv_ml4110 \
    -lopencv_objdetect4110 \
    -lopencv_photo4110 \
    -lopencv_stitching4110 \
    -lopencv_video4110 \
    -lopencv_videoio4110
cpp 复制代码
INCLUDEPATH +=H:\Qt\opencv3.4.0\OpenCV-MinGW-Build-OpenCV-3.4.5\include \
              H:\Qt\opencv3.4.0\OpenCV-MinGW-Build-OpenCV-3.4.5\include \
              H:\Qt\opencv3.4.0\OpenCV-MinGW-Build-OpenCV-3.4.5\include\opencv2

LIBS +=H:\Qt\opencv3.4.0\OpenCV-MinGW-Build-OpenCV-3.4.5\x86\mingw\bin\libopencv_*.dll

2、实用转换

2.1 mat转QImage

cpp 复制代码
//值得注意的是,在转化8位3通道的图像时,OpenCV和QImage使用的红蓝通道是相反的,需要使用rgbSwapped方法互换一下
//---------------------------------------------------------------------------------
QImage QCVMatDataCorvent::QCVMat2QImage(const cv::Mat& mat)
{
    const unsigned char* data = mat.data;

    int width = mat.cols;
    int height = mat.rows;
    int bytesPerLine = static_cast<int>(mat.step);
    switch(mat.type())
    {
        //8 bit , ARGB
        case CV_8UC4:
        {
            QImage image(data, width, height, bytesPerLine, QImage::Format_ARGB32);
            return image;
        }

        //8 bit BGR
        case CV_8UC3:
        {
            QImage image(data, width, height, bytesPerLine, QImage::Format_RGB888);
            //swap blue and red channel
            return image.rgbSwapped();
        }

        //8 bit Gray shale
        case CV_8UC1:
        {
            QImage image(data, width, height, bytesPerLine, QImage::Format_Grayscale8);
            return image;
        }

        //
        default:
        {
            //Unsupported format
            qWarning()<<"Unsupported cv::Mat type:"<<mat.type()
                     <<", Empty QImage will be returned!";
            return QImage();
        }
    }
}
cpp 复制代码
cv::Mat imgMat = cv::imread(imgPath.toStdString().c_str());
QImage img = QCVMatDataCorvent::QCVMat2QImage(imgMat);
ui->ImgLabel->setPixmap(QPixmap::fromImage(img));
resize(width()-ui->ImgLabel->width()+img.width(),
       height()-ui->ImgLabel->height()+img.height());

2.2 红绿灯检测

【C++】OpenCV:红绿灯检测介绍及实现示例
【交通灯】红绿灯识别 轮廓识别 C++ OpenCV 案例实现(好)
OpenCV中的findContours函数参数详解

最简方法:

在C++中使用OpenCV进行红绿灯检测,可以通过颜色空间分割与轮廓分析实现,不依赖深度学习即可获得较好效果。

步骤说明

  1. 读取与预处理图像
  • 使用 cv::VideoCapture 读取视频帧或图片。
  • 转换为 HSV颜色空间,便于分离红色与绿色区域。
  1. 颜色阈值分割
  • 定义红色与绿色的HSV范围,使用 cv::inRange 提取对应颜色区域。
  • 对红色需考虑两个Hue区间(低端和高端)。
  1. 形态学处理去噪
    -使用 cv::erode 和 cv::dilate 去除小噪点,保留主要目标区域。
  2. 轮廓检测与筛选
  • 使用 cv::findContours 获取轮廓,根据面积、形状筛选可能的红绿灯区域。
  1. 状态判断
  • 根据检测到的颜色区域位置与大小,判断当前状态为 红灯、绿灯或无灯。
cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
Mat frame, hsv, maskRed1, maskRed2, maskGreen;
VideoCapture cap("traffic_light.mp4");

while (cap.read(frame)) {
cvtColor(frame, hsv, COLOR_BGR2HSV);

Scalar lowerRed1(0, 100, 100), upperRed1(10, 255, 255);
Scalar lowerRed2(160, 100, 100), upperRed2(179, 255, 255);
Scalar lowerGreen(35, 100, 100), upperGreen(85, 255, 255);

inRange(hsv, lowerRed1, upperRed1, maskRed1);
inRange(hsv, lowerRed2, upperRed2, maskRed2);
inRange(hsv, lowerGreen, upperGreen, maskGreen);

Mat redMask = maskRed1 | maskRed2;
morphologyEx(redMask, redMask, MORPH_OPEN, Mat());
morphologyEx(maskGreen, maskGreen, MORPH_OPEN, Mat());

if (countNonZero(redMask) > countNonZero(maskGreen))
putText(frame, "RED", {50,50}, FONT_HERSHEY_SIMPLEX, 1, Scalar(0,0,255), 2);
else if (countNonZero(maskGreen) > 0)
putText(frame, "GREEN", {50,50}, FONT_HERSHEY_SIMPLEX, 1, Scalar(0,255,0), 2);

imshow("Traffic Light Detection", frame);
if (waitKey(30) == 27) break;
}
}
相关推荐
词却11 小时前
OpenCV学习:dlib 人脸检测
人工智能·opencv·学习
matlab代码14 小时前
基于matlab阈值分割的车牌识别系统【源码75期】
图像处理·opencv·计算机视觉
leoZ2311 天前
2026-09-10-静态扫描连错三次-用运行环境当裁判
前端·javascript·vue.js·人工智能·opencv·机器学习·数据挖掘
hhzz2 天前
【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化
人工智能·python·opencv·性能优化
2601_962293532 天前
第3.7章 机器人第三方库实战总结(七):OpenCV视觉SLAM核心库详解:API速查+源码实例+避坑指南
图像处理·opencv·计算机视觉·slam·第三方库
hhzz2 天前
【OpenCV 入门到精通 04】视频入门与绘图交互:从摄像头到鼠标画笔
人工智能·python·opencv·计算机视觉·音视频·交互
棣廷2 天前
初识OpenCV——人脸检测与识别实战
人工智能·opencv·计算机视觉
泡干脆面就番茄2 天前
04_EigenFace特征脸PCA人脸识别
python·opencv
欧特克_Glodon3 天前
OpenCV计算机视觉开发入门与实践<四十二>:手势识别
c++·人工智能·opencv·计算机视觉·手势识别
matlab代码3 天前
基于数字图像处理的表面缺陷检测设计(点线面)【源码70期】
图像处理·opencv·计算机视觉