代码备份:
//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;
}