首页 > 代码库 > opencv2实现单张图片的路线路牌检测_计算机视觉大作业2
opencv2实现单张图片的路线路牌检测_计算机视觉大作业2
有好多代码没有用
linefiner.h
#if !defined LINEF #define LINEF #include<cmath> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #define PI 3.1415926 class LineFinder { private: // original image cv::Mat img; // vector containing the end points // of the detected lines std::vector<cv::Vec4i> lines; // accumulator resolution parameters double deltaRho; double deltaTheta; // minimum number of votes that a line // must receive before being considered int minVote; // min length for a line double minLength; // max allowed gap along the line double maxGap; public: // Default accumulator resolution is 1 pixel by 1 degree // no gap, no mimimum length LineFinder() : deltaRho(1), deltaTheta(PI/180), minVote(10), minLength(0.), maxGap(0.) {} // Set the resolution of the accumulator void setAccResolution(double dRho, double dTheta) { deltaRho= dRho; deltaTheta= dTheta; } // Set the minimum number of votes void setMinVote(int minv) { minVote= minv; } // Set line length and gap void setLineLengthAndGap(double length, double gap) { minLength= length; maxGap= gap; } // Apply probabilistic Hough Transform std::vector<cv::Vec4i> findLines(cv::Mat& binary) { lines.clear(); cv::HoughLinesP(binary,lines,deltaRho,deltaTheta,minVote, minLength, maxGap); return lines; } // Draw the detected lines on an image void drawDetectedLines(cv::Mat &image, cv::Scalar color=cv::Scalar(255,0,0)) { // Draw the lines std::vector<cv::Vec4i>::const_iterator it2= lines.begin(); while (it2!=lines.end()) { cv::Point pt1((*it2)[0],(*it2)[1]); cv::Point pt2((*it2)[2],(*it2)[3]); double slope = fabs(double((*it2)[1]-(*it2)[3])/((*it2)[0]-(*it2)[2])); // double slope = fabs (((double)(lines[1].y-lines[0].y))/((double)(lines[1].x-lines[0].x))); //求直线在坐标系中的斜率 //double length=sqrt((line[1].y-line[0].y)*(line[1].y-line[0].y)+(line[1].x-line[0].x)*(line[1].x-line[0].x)); ////线段的长度 //if((slope>0.3)&&(slope<1000)&&(length>50)&&(length<500)) //{ // line[0].y= line[0].y+ROI_rect_src.y; // line[1].y =line[1].y+ROI_rect_src.y; // cvLine(frame, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 ); //} if((slope>0.5)&&(slope<2)) { cv::line( image, pt1, pt2, color,3,8,0); } ++it2; } } // Eliminates lines that do not have an orientation equals to // the ones specified in the input matrix of orientations // At least the given percentage of pixels on the line must // be within plus or minus delta of the corresponding orientation //std::vector<cv::Vec4i> removeLinesOfInconsistentOrientations( // const cv::Mat &orientations, double percentage, double delta) { // std::vector<cv::Vec4i>::iterator it= lines.begin(); // // check all lines // while (it!=lines.end()) { // // end points // int x1= (*it)[0]; // int y1= (*it)[1]; // int x2= (*it)[2]; // int y2= (*it)[3]; // // // line orientation + 90o to get the parallel line // double ori1= atan2(static_cast<double>(y1-y2),static_cast<double>(x1-x2))+PI/2; // if (ori1>PI) ori1= ori1-2*PI; // double ori2= atan2(static_cast<double>(y2-y1),static_cast<double>(x2-x1))+PI/2; // if (ori2>PI) ori2= ori2-2*PI; // // for all points on the line // cv::LineIterator lit(orientations,cv::Point(x1,y1),cv::Point(x2,y2)); // int i,count=0; // for(i = 0, count=0; i < lit.count; i++, ++lit) { // float ori= *(reinterpret_cast<float *>(*lit)); // // is line orientation similar to gradient orientation ? // if (std::min(fabs(ori-ori1),fabs(ori-ori2))<delta) // count++; // } // double consistency= count/static_cast<double>(i); // // set to zero lines of inconsistent orientation // if (consistency < percentage) { // (*it)[0]=(*it)[1]=(*it)[2]=(*it)[3]=0; // } // ++it; // } // return lines; //} }; #endif
main.cpp
#include <iostream> #include <vector> #include <opencv2/core/core.hpp> //#include <opencv2/imageproc/imageproc.hpp> #include <opencv2/highgui/highgui.hpp> #include "linefinder.h" //#include "edgedetector.h" using namespace cv; using namespace std; #define PI 3.1415926 int main() { // Read input image Mat image= imread("1.jpg",1); if (!image.data) return 0; //CvRect ROI_rect_src; //矩形框的偏移和大小 //ROI_rect_src.x =0;//方形的最左角的x-坐标 //ROI_rect_src.y =0;//方形的最上或者最下角的y-坐标 //ROI_rect_src.width =image.size().width;//宽 //ROI_rect_src.height =3000;//高 // Display the image Mat mf1(image.size(),image.type()); medianBlur(image,mf1,3); // Mat image; // cvtColor(image,image,CV_BGR2GRAY); GaussianBlur(image,image,Size(5,5),1.5); namedWindow("Original Image"); imshow("Original Image",image); Mat img=image(Rect(0.4*image.cols,0.58*image.rows,0.4*image.cols,0.3*image.rows)); Mat contours; Canny(img,contours,80,100); cv::Mat contoursInv; cv::threshold(contours,contoursInv,128,255,cv::THRESH_BINARY_INV); // Display the image of contours cv::namedWindow("Canny Contours"); cv::imshow("Canny Contours",contoursInv); // Create LineFinder instance LineFinder ld; // Set probabilistic Hough parameters ld.setLineLengthAndGap(80,30); ld.setMinVote(30); //Mat img=image(Rect(0.2*contours.cols,0.6*contours.rows,0.5*contours.cols,0.25*contours.rows)); // Detect lines vector<Vec4i> li= ld.findLines(contours); ld.drawDetectedLines(img); // ld.removeLinesOfInconsistentOrientations(img,0.4,0.1); namedWindow(" HoughP"); imshow(" HoughP",img); namedWindow("Detected Lines with HoughP"); imshow("Detected Lines with HoughP",image); 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, // accumulator resolution (size of the image / 2) 50, // minimum distance between two circles 200, // Canny high threshold 100, // minimum number of votes 25, 50); // min and max radius cout << "Circles: " << circles.size() << endl; // Draw the circles //image= imread("chariot.jpg",0); vector<Vec3f>::const_iterator itc= circles.begin(); while (itc!=circles.end()) { circle(image, Point((*itc)[0], (*itc)[1]), // circle centre (*itc)[2], // circle radius Scalar(255), // color 2); // thickness ++itc; } namedWindow("Detected Circles"); imshow("Detected Circles",image); waitKey(); return 0; }
结果:
把左边两条线变为一条:
Mat mf1(image.size(),image.type()); medianBlur(image,mf1,3); // Mat image; // cvtColor(image,image,CV_BGR2GRAY); GaussianBlur(image,image,Size(5,5),1.5);注释掉就好了。
只是一张图片,具有特殊性,不知道其他图片什么结果。
opencv2实现单张图片的路线路牌检测_计算机视觉大作业2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。