Opencv 基于C++识别绿灯


Opencv 基于C++识别绿灯


**

在这里插入图片描述

基本思路

1.对inRange图像 获取绿色像素点区域

2.对图像二值化处理

3.框选ROI区域

图片: Alt

带尺寸的图片: Alt

甘特图功能

Mon 06

Mon 13

Mon 20

已完成

进行中

计划一

计划二

现有任务

Adding GANTT diagram functionality to mermaid

整体代码就是这样:


#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/highgui/highgui.hpp>
#include <opencv4/opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include <time.h>

using namespace cv;
using namespace std;

clock_t start,finish;
Mat srcImage;
vector<Vec3f>circles;
Mat templateImage;
Mat resultImage;

//void processFrame(Mat& img, Rect& rect);//绘制外接矩形
double area=0.0;

void processFrame(Mat & img, Rect & rect)
{
	//寻找外接轮廓
	vector<vector<Point>>contours;
	vector<Vec4i>hierarchy;
	findContours(img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(-1, -1));
	
	if (contours.size() > 0) 
	{
		for (size_t i = 0; i < contours.size(); i++)
		{
			double contours_Area = contourArea(contours[static_cast<int>(i)]);//面积
			rect = boundingRect(contours[static_cast<int>(i)]);//外接矩形
			if (contours_Area > area)
			{
				area = contours_Area;
			}
		}
		
	}
	else
	{
		rect.x = rect.y = rect.width = rect.height = 0;
	}
}

int main(int argc, char** argv)
{
	Rect roi;//存储最大外接矩形的数据
    
	VideoCapture capture;
	capture.open(2);

  


	if (!capture.isOpened())
	{
		cout << "图像读取错误!~" << endl;
		return -1;
	}
	
	Mat frame,dst;
	int Number_of_successful=-1;
	int number=-1;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	Mat kernel_dilite = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));

	while (capture.read(frame))
	{
		start = clock();

		//筛选出绿色
		inRange(frame, Scalar(0, 127, 0), Scalar(120, 255, 120), dst);
	  
			
		//开操作去噪点
		morphologyEx(dst, dst, MORPH_OPEN, kernel, Point(-1, -1), 1);

		//膨胀操作把绿灯具体化的显示出来
		dilate(dst, dst, kernel_dilite, Point(-1, -1), 2);
		imshow("output video", dst);
		processFrame(dst, roi);
		rectangle(frame, roi, Scalar(0, 0, 255), 3, 8, 0);


          if(area>=800)  //根据距离调参数  (800)
        {
  
            cout<<"绿灯完成"<<endl;
            cout<<"开始启动"<<endl;
        }

        
        finish= clock();

        double Frame1 = 1000/(double(finish-start)/CLOCKS_PER_SEC*1000);
        // cout<<"算法进行时间为:"<<time<<endl;
        // cout<<"视觉识别帧率为:"<<Frame<<endl;
        std::string str = std::to_string(Frame1);
        string Frame_name = "FPS:";
        Frame_name +=str;
        //cout<<"视觉识别帧率为:"<<Frame_name<<endl;
        putText(frame,Frame_name,Point(0,50),FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255));
		imshow("input video", frame);

		char c = waitKey(50);
		if (c == 27)
		{
			break;
		}

   

	}

	capture.release();
	waitKey(0);
	return 0;

}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>