Superp321 2020-04-13 23:03 采纳率: 0%
浏览 1836

opencv c++ 视频中红绿灯实时识别

这是个识别视频中的红绿灯的程序,但是不知道为什么视频上显示的一直都是红灯,不知道是不是我的检测颜色的函数有问题还是其他地方有问题,是我的课设题目,挺着急的,拜托大家帮忙看一下,万分感谢。视频大概是下面这样的。
图片说明图片说明图片说明

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include"putText.h"

using namespace std;
using namespace cv;
int detectColor(Mat image);//检测颜色
int main()
{
Mat frame, mask,gray,dst,frame1;
VideoCapture cap;
namedWindow("dst", 0);
resizeWindow("dst", 500, 400);
if (!cap.open("红绿灯1.mp4"))
{
    cout << "video is err" << endl;
    return -1;
}
while (1)
{
    cap >> frame;
    if (frame.empty())
        break;
    frame1 = frame.clone();
    dst = Mat::zeros(frame.size(), frame.type());
    mask = Mat::zeros(frame.size(), CV_8U);
    cvtColor(frame, gray, COLOR_BGR2GRAY);
    vector<Vec3f> circles;
    HoughCircles(gray, circles, HOUGH_GRADIENT, 1, 10, 40, 40, 10, 25);![图片说明](https://img-ask.csdn.net/upload/202004/13/1586789476_427968.png)

    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circle(mask, center, radius, Scalar(255), -1); //roi
        frame1.copyTo(dst, mask);
        //绘制圆心
        circle(frame, center, 3, Scalar(0, 255, 0), -1, 8, 0);
        //绘制圆的轮廓
        circle(frame, center, radius, Scalar(155, 50, 255), 3, 8, 0);
        circle(mask, center, radius, Scalar(255), -1);
    }

    if(detectColor(dst)==1)
    putTextZH(frame, "红灯", Point(200, 150), Scalar(255, 0, 255), 50, "楷体");
    else if(detectColor(dst)==2)
        putTextZH(frame, "绿灯", Point(200, 150), Scalar(255, 0, 255), 50, "楷体");
    else //if(detectColor(dst)==3)
        putTextZH(frame, "黄灯", Point(200, 150), Scalar(255, 0, 255), 50, "楷体");
    imshow("vedio", frame);
    if (waitKey(100) == 27)
        break;
}
cap.release();
destroyAllWindows();
return 0;
}
int detectColor(Mat image)
{
Mat mask;
cvtColor(image, image, COLOR_BGR2HSV);
const Scalar hsvRedLo(10, 193, 198);
const Scalar hsvRedHi(28, 220,206);

const Scalar hsvGreenLo(72, 242, 186);
const Scalar hsvGreenHi(90, 255, 255);

const Scalar hsvYellowLo(24, 219, 196);
const Scalar hsvYellowHi(32, 255, 217);

vector<Scalar> hsvLo{ hsvRedLo,hsvGreenLo,hsvYellowLo };
vector<Scalar> hsvHi{ hsvRedHi,hsvGreenHi,hsvYellowHi };

inRange(image, hsvLo[1], hsvHi[1], mask);
inRange(image, hsvLo[2], hsvHi[2], mask);
inRange(image, hsvLo[0], hsvHi[0], mask);

Mat redBlur, greenBlur, yellowBlur;
medianBlur(mask, redBlur, 5);
medianBlur(mask, greenBlur, 5);
medianBlur(mask, yellowBlur, 5);
int red, green, yellow, lightColor;
red = countNonZero(redBlur);
green = countNonZero(greenBlur);
yellow = countNonZero(yellowBlur);
lightColor = (red > green) ? (red > yellow ? red : yellow) : (green > yellow ? green : yellow);
    if (lightColor == red)
        return 1;
    else if (lightColor == green)
        return 2;
    else if (lightColor == yellow)
        return 3;
    else return 0;
}
  • 写回答

1条回答 默认 最新

  • 小学狗喵喵叫 2020-04-14 12:29
    关注
    Mat maskRed,maskYellow,maskGreen;
    cvtColor(image, image, COLOR_BGR2HSV);
    const Scalar hsvRedLo(10, 193, 198);
    const Scalar hsvRedHi(28, 220,206);
    
    const Scalar hsvGreenLo(72, 242, 186);
    const Scalar hsvGreenHi(90, 255, 255);
    
    const Scalar hsvYellowLo(24, 219, 196);
    const Scalar hsvYellowHi(32, 255, 217);
    
    vector<Scalar> hsvLo{ hsvRedLo,hsvGreenLo,hsvYellowLo };
    vector<Scalar> hsvHi{ hsvRedHi,hsvGreenHi,hsvYellowHi };
    
    inRange(image, hsvLo[1], hsvHi[1], maskGreen);
    inRange(image, hsvLo[2], hsvHi[2], maskYellow);
    inRange(image, hsvLo[0], hsvHi[0], maskRed);
    
    Mat redBlur, greenBlur, yellowBlur;
    medianBlur(maskRed, redBlur, 5);
    medianBlur(maskGreen, greenBlur, 5);
    medianBlur(maskYellow, yellowBlur, 5);
    
    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配