首页 > 代码库 > opencv2实现路线路牌检测_计算机视觉大作业2终版
opencv2实现路线路牌检测_计算机视觉大作业2终版
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 = http://www.mamicode.com/cvLoadImage(cname); >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; } } }; #endifopencv2实现路线路牌检测_计算机视觉大作业2终版
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。