利用opencv识别路标

代码备份:

//RGB版本
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int hmin=0,smin=0,vmin=0,hmax=0,smax=0,vmax=0;
int main()
{
    Mat img,src,src_ROI,dst;

    VideoCapture cap(0);
    double t = 0;
    double fps;
    for(;;)
    {
        t = (double)cv::getTickCount();
        cap.read(img);
        imshow("原图",img);

        std::vector<Mat> channels;
        //src为要分离的Mat对象
        split(img, channels);             //利用vector对象分离
        channels.at(0)=0;
//        channels.at(1)=130;
        merge(channels,src);
        cvtColor(src,src,COLOR_BGR2GRAY);
        threshold(src,dst,200,100,3);
//        边缘检测
        Canny(dst,dst,3,9,3);
        imshow("dst",dst);

//        高斯滤波
//        GaussianBlur(src,src,Size(9,9),2,2);
//        imshow("高斯滤波图",src);

//        霍夫圆
        vector<Vec3f> circles;
        HoughCircles(src,circles,HOUGH_GRADIENT,1,30,170,100,0,0);


        int rad,rad2,a,b;
        int cent_x,cent_y,radius;

        if(circles.size()==1)
        {
        for(int i=0; i<=circles.size(); i++)
        {
            cent_x=cvRound(circles[i][0]);
            if (cent_x<=0){continue;}
            cent_y=cvRound(circles[i][1]);
            if (cent_y<=0){continue;}
            radius = cvRound(circles[i][2]);
            if (radius<=0){continue;}
            rad=radius*0.75;
            rad2=rad*2;
            a=cent_x-rad;
            b=cent_y-rad;
            //画圆
            circle(src, Point(circles[i][0], circles[i][1]),
                                circles[i][2], Scalar(0, 0, 255),-1,8,0);

            rectangle(img,Point(cent_x-rad,cent_y-rad),Point(cent_x+rad,cent_y+rad),Scalar(0,255,5),5);//在空白图像上画矩形

            src_ROI = dst(Rect(a,b,rad2,rad2)); //路标ROI区域

            //【3】进行霍夫线变换
                vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
                HoughLinesP(src_ROI, lines, 1, CV_PI/180, 80, 50, 10 );

                //【4】依次在图中绘制出每条线段
                for( size_t i = 0; i < lines.size(); i++ )
                {
                    Vec4i l = lines[i];
                    line( img, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,0,0), 2, 8);
                }
        }
            resize(src_ROI,src_ROI,Size(src_ROI.cols/2,src_ROI.rows/2));
            imshow("ROI区域",src_ROI);
            imshow("矩形图",img);
        }
        else{cout<<"没有找到圆"<<endl;}

        t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
        fps = 1.0 / t;
        cout<<"fps="<<fps<<endl;
        if(waitKey(10)==27){break;}
    }
        return 0;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值