码迷,mamicode.com
首页 > 其他好文 > 详细

opencv2实现路线路牌检测_计算机视觉大作业2终版

时间:2014-12-16 17:15:51      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:计算机视觉   视频流   直线圆检测   

main.cpp
#include<stdio.h>
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<string>  
#include <sstream>
#include "linefinder.h"
#include<time.h>
#include <opencv2\opencv.hpp> 
using namespace cv;
using namespace std;


int main()
{
	stringstream ss;  
	string str; 
	stringstream sss;  
	string strs; 
	  clock_t start,finish;
   double totaltime;
   start=clock();
	for(int i=1;i<=80;i++)  
	{  
		str="C:\\Users\\hsn\\Desktop\\直线检测\\直线检测\\作业2\\";//选择80张图片  
		ss.clear();  
		ss<<str;  
		ss<<i;  
		ss<<".jpg";  
		ss>>str;  
		Mat image=imread(str,1); //读入图片
		
		if (!image.data)
			return 0; 
		
		Mat img=image(Rect(0.4*image.cols,0.58*image.rows,0.4*image.cols,0.3*image.rows));//选择感兴趣的区域

		//canny变换
		Mat contours;
		Canny(img,contours,80,100);
		Mat contoursInv;
		threshold(contours,contoursInv,128,255,THRESH_BINARY_INV);

		LineFinder ld;//LineFinder类型的一个变量,调用头文件函数
		// 设置Hough概率参数
		ld.setLineLengthAndGap(60,40);
		ld.setMinVote(30);
		//检测直线
		vector<Vec4i> li= ld.findLines(contours);
		//画直线
		ld.drawDetectedLines(img);
		/////////检测圆
		Mat imgGry;
		cvtColor(image,imgGry,CV_BGR2GRAY);
		GaussianBlur(imgGry,imgGry,Size(5,5),1.5);//高斯平滑
		vector<Vec3f> circles;
		HoughCircles(imgGry, circles, CV_HOUGH_GRADIENT, 
			2,   // 累加器分辨率 (图像大小的一半) 
			150,  // 两圆之间最小距离
			200, // Canny变换高阈值
			100, // 最小支持数
			25, 50); // 最小和最大半径

		cout << "Circles: " << circles.size() << endl;//输出圆的个数

		// /////////////////画圆
		vector<Vec3f>::const_iterator itc= circles.begin();

		while (itc!=circles.end()) {

			circle(image, 
				Point((*itc)[0], (*itc)[1]), // 圆心
				(*itc)[2], // 半径
				Scalar(255), // 颜色 
				2); // 宽度

			++itc;	
		}
		//////保存图片
		strs="C:\\Users\\hsn\\Desktop\\直线检测\\直线检测\\处理后\\";//选择80张图片  
		sss.clear();  
		sss<<strs;  
		sss<<i;  
		sss<<".jpg";  
		sss>>strs;  
		imwrite(strs,image);//写入
		
	}
	finish=clock();
   totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
   cout<<"\n平均每帧运行时间为"<<totaltime/80<<"秒!"<<endl;
	////////////////////将图片合成视频
	int num = 1;  
	CvSize size = cvSize(1024,960);  //视频帧格式的大小  
	double fps = 10;////每秒钟的帧率  
	CvVideoWriter *writer = cvCreateVideoWriter("C:\\Users\\hsn\\Desktop\\直线检测\\直线检测\\路线路牌检测.avi",-1,fps,size); //创建视频文件  
	char cname[100];  
	sprintf(cname,"C:\\Users\\hsn\\Desktop\\直线检测\\直线检测\\处理后\\%d.jpg",num); //加载图片的文件夹,图片的名称编号是1开始1,2,3,4,5.。。。  
	IplImage *src = cvLoadImage(cname);  
	if (!src)  
	{  
		return 0;  
	}  
	IplImage *src_resize = cvCreateImage(size,8,3); //创建视频文件格式大小的图片  
	cvNamedWindow("avi");  
	while (src)  
	{  
		cvShowImage("avi",src_resize);  
		cvWaitKey(1); 
		cvResize(src,src_resize); //<span style="white-space:pre">    </span>//将读取的图片设置为视频格式大小相同  
		cvWriteFrame(writer,src_resize); //保存图片为视频流格式  
		cvReleaseImage(&src);// <span style="white-space:pre">        </span> //释放空间  
		num++;  
		sprintf(cname,"C:\\Users\\hsn\\Desktop\\直线检测\\直线检测\\处理后\\%d.jpg",num);  
		src = cvLoadImage(cname);       //循环读取数据  
	}  
	cvReleaseVideoWriter(&writer);   
	cvReleaseImage(&src_resize);  
	waitKey();
	
	return 0;
}

LineFinder.h

#if !defined LINEF
#define LINEF
#include<cmath>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#define PI 3.1415926
using namespace cv;
using namespace std;
class LineFinder {

private:

	// 原始图像
	Mat img;
	vector<Vec4i> lines;//包含结束点的检测直线

	// 累加器分辨率
	double deltaRho;
	double deltaTheta;

	// 直线得到支持的最小个数
	int minVote;

	// 直线的最短长度
	double minLength;

	// 最大允许误差
	double maxGap;

public:

	// 默认累加器分辨率是PI/180
	// 没有最大允许误差,没有最小长度
	LineFinder() : deltaRho(1), deltaTheta(PI/180), minVote(10), minLength(0.), maxGap(0.) {}

	// 设置累加器分辨率
	void setAccResolution(double dRho, double dTheta) {

		deltaRho= dRho;
		deltaTheta= dTheta;
	}

	// 设置最小支持数
	void setMinVote(int minv) {

		minVote= minv;
	}

	// 设置最大允许误差和最小直线长度
	void setLineLengthAndGap(double length, double gap) {

		minLength= length;
		maxGap= gap;
	}

	// 应用概率霍夫变换
	vector<Vec4i> findLines(Mat& binary) {

		lines.clear();
		HoughLinesP(binary,lines,deltaRho,deltaTheta,minVote, minLength, maxGap);

		return lines;
	}

	//在图像上画找到的直线
	void drawDetectedLines(Mat &image, Scalar color=Scalar(255,0,0)) {

		// 画直线
		vector<Vec4i>::const_iterator it2= lines.begin();

		while (it2!=lines.end()) {

			Point pt1((*it2)[0],(*it2)[1]);        
			Point pt2((*it2)[2],(*it2)[3]);
			double slope = fabs(double((*it2)[1]-(*it2)[3])/((*it2)[0]-(*it2)[2]));//计算斜率
			if((slope>0.53)&&(slope<2))//如果斜率满足范围进行画线
			{
				line( image, pt1, pt2, color,3,8,0);
			}
			++it2;	
		}
	}

};


#endif


opencv2实现路线路牌检测_计算机视觉大作业2终版

标签:计算机视觉   视频流   直线圆检测   

原文地址:http://blog.csdn.net/hanshuning/article/details/41960995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!