任务要求:识别图片上的方向信息并打印在终端上



以上为示例图片
任务思路:对图片进行滤波等几步预处理之后,在图片中寻找轮廓,将其轮廓包围获得一个包围图形,使用角点检测将其识别。
#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<iostream>using namespace cv;using namespace std;void on_CornerHarris(int, void*);int main(){Mat src,ROI1,graysrc,dst,dst1,img;src=imread("/home/ma/图片/mmexport1601205165349.jpg");imshow("原圖",src);ROI1=src(Rect(100,100,320,300));imshow("roi1",ROI1);blur(ROI1,graysrc,Size(3,6));cvtColor(graysrc,dst,COLOR_BGR2GRAY);Canny(graysrc,dst,100,200,3,false);cvtColor(dst,dst1,COLOR_GRAY2BGR);threshold(dst1,img,60,100,THRESH_BINARY);vector<Vec4f>lines;HoughLinesP(dst,lines,1,CV_PI/180,10,0,0);Scalar color=Scalar(0,0,255);for (size_t i = 0; i < lines.size(); i++){Vec4f plines=lines[i];line(img,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color,3,LINE_AA);}putText(img,"Straight",Point(100,280),FONT_HERSHEY_COMPLEX, 1, Scalar(255,23,0),4,8);imshow("output",img);Mat src1,ROI2,src2,dst2,dst3,dst4,dst5;src1=imread("/home/ma/图片/mmexport1601200552742.jpg");imshow("原圖1",src1);ROI2=src1(Rect(100,100,320,300));blur(ROI2,src2,Size(3,3));cvtColor(src2,dst2,COLOR_BGR2GRAY);Canny(dst2,dst3,100,200,3,false);cvtColor(dst3,dst4,COLOR_GRAY2BGR);threshold(dst4,dst5,60,100,THRESH_BINARY);vector<Vec4f>lines1;HoughLinesP(dst3,lines1,1,CV_PI/180,10,0,0);Scalar color1=Scalar(0,0,255);for(size_t j=0; j < lines1.size(); j++){Vec4f plines=lines1[j];line(dst5,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color1,3,LINE_AA);}putText(dst5,"leftturn",Point(80,50),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);imshow("output1",dst5);Mat src3,ROI3,dst6,dst7,dst8,dst9,dst10;src3=imread("/home/ma/下载/mmexport1601200550450.jpg");imshow("原圖2",src3);ROI3=src3(Rect(150,100,320,300));blur(ROI3,dst6,Size(2,4));cvtColor(dst6,dst7,COLOR_BGR2GRAY);Canny(dst7,dst8,100,200,3,false);cvtColor(dst8,dst9,COLOR_GRAY2BGR);threshold(dst9,dst10,60,100,THRESH_BINARY);vector<Vec4f>lines2;HoughLinesP(dst8,lines2,1,CV_PI/180,10,0,0);Scalar color2=Scalar(0,0,255);for(size_t k=0; k< lines2.size(); k++){Vec4f plines=lines2[k];line(dst10,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color2,3,LINE_AA);}putText(dst10,"rightturn",Point(100,260),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);imshow("output2",dst10);Mat src4,ROI4,dsta,dstb,dstc,dstd,dste;src4=imread("/home/ma/下载/mmexport1601200545676.jpg");imshow("原圖3",src4);ROI4=src4(Rect(150,20,380,330));blur(ROI4,dsta,Size(3,3));cvtColor(dsta,dstb,COLOR_BGR2GRAY);Canny(dstb,dstc,100,200,3,false);cvtColor(dstc,dstd,COLOR_GRAY2BGR);threshold(dstd,dste,60,100,THRESH_BINARY);vector<Vec4f>lines3;HoughLinesP(dstc,lines3,1,CV_PI/180,10,0,0);Scalar color3=Scalar(0,0,255);for(size_t z=0; z < lines3.size();z++){Vec4f plines=lines3[z];line(dste,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color3,3,LINE_AA);}putText(dste,"crossing",Point(205,100),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);imshow("output3",dste);waitKey(0);return 0;}
以上为第一版代码,因为二值化的阈值调的太大导致代码效率很低。
#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<iostream>using namespace cv;using namespace std;int main(){Mat src,ROI1,graysrc,dst,dst1,img;src=imread("/home/ma/图片/mmexport1601205165349.jpg");imshow("原圖",src);ROI1=src(Rect(100,100,320,300));blur(ROI1,graysrc,Size(3,3));cvtColor(ROI1,graysrc,COLOR_BGR2GRAY);Canny(graysrc,dst,100,200,3,false);cvtColor(dst,dst1,COLOR_GRAY2BGR);threshold(dst1,img,60,100,THRESH_BINARY);vector<Vec4f>lines;HoughLinesP(dst,lines,1,CV_PI/90,10,10,10);Scalar color=Scalar(0,0,255);for (size_t i = 0; i < lines.size(); i++){Vec4f plines=lines[i];line(img,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color,3,LINE_AA);}vector<Point2f>getlines1(vector<Vec4f>lines);float k1;vector<Point2f>linesk1;for(unsigned int a=0;a<lines.size();a++){k1=(double)(lines[a][3]-lines[a][1])/(double)(lines[a][3]-lines[a][1]);}cout<<k1<<endl;if(k1==1){putText(img,"Straight",Point(100,280),FONT_HERSHEY_COMPLEX, 1, Scalar(255,23,0),4,8);}imshow("output",img);Mat src1,ROI2,src2,dst2,dst3,dst4,dst5;src1=imread("/home/ma/图片/mmexport1601200552742.jpg");imshow("原圖1",src1);ROI2=src1(Rect(100,100,320,300));blur(ROI2,src2,Size(3,3));cvtColor(src2,dst2,COLOR_BGR2GRAY);Canny(dst2,dst3,100,200,3,false);cvtColor(dst3,dst4,COLOR_GRAY2BGR);threshold(dst4,dst5,60,100,THRESH_BINARY);vector<Vec4f>lines1;HoughLinesP(dst3,lines1,1,CV_PI/180,10,0,10);Scalar color1=Scalar(0,0,255);for(size_t j=0; j < lines1.size(); j++){Vec4f plines=lines1[j];line(dst5,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color1,3,LINE_AA);}vector<Point2f>getlines2(vector<Vec4f>lines1);float k2;vector<Point2f>linesk2;for(unsigned int b=0;b<lines1.size();b++){k2=(double)(lines1[b][3]-lines1[b][1])/(double)(lines1[b][3]-lines1[b][1]);}if(k2==1){putText(dst5,"leftturn",Point(80,50),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);}imshow("output1",dst5);Mat src3,ROI3,dst6,dst7,dst8,dst9,dst10;src3=imread("/home/ma/下载/mmexport1601200550450.jpg");imshow("原圖2",src3);ROI3=src3(Rect(150,100,320,300));blur(ROI3,dst6,Size(3,4));cvtColor(dst6,dst7,COLOR_BGR2GRAY);Canny(dst7,dst8,100,200,3,false);cvtColor(dst8,dst9,COLOR_GRAY2BGR);threshold(dst9,dst10,60,100,THRESH_BINARY);vector<Vec4f>lines2;HoughLinesP(dst8,lines2,1,CV_PI/180,10,0,15);Scalar color2=Scalar(0,0,255);for(size_t k=0; k< lines2.size(); k++){Vec4f plines=lines2[k];line(dst10,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color2,3,LINE_AA);}vector<Point2f>getlines2(vector<Vec4f>lines2);float k3;vector<Point2f>linesk3;for(unsigned int c=0;c<lines2.size();c++){k3=(double)(lines1[c][3]-lines1[c][1])/(double)(lines1[c][3]-lines1[c][1]);}if(k3==1){putText(dst10,"rightturn",Point(100,260),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);}imshow("output2",dst10);Mat src4,ROI4,dsta,dstb,dstc,dstd,dste;src4=imread("/home/ma/下载/mmexport1601200545676.jpg");imshow("原圖3",src4);ROI4=src4(Rect(150,20,380,330));blur(ROI4,dsta,Size(3,3));cvtColor(dsta,dstb,COLOR_BGR2GRAY);Canny(dstb,dstc,100,200,3,false);cvtColor(dstc,dstd,COLOR_GRAY2BGR);threshold(dstd,dste,60,100,THRESH_BINARY);vector<Vec4f>lines3;HoughLinesP(dstc,lines3,1,CV_PI/180,10,0,15);Scalar color3=Scalar(0,0,255);for(size_t z=0; z < lines3.size();z++){Vec4f plines=lines3[z];line(dste,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color3,3,LINE_AA);}vector<Point2f>getlines2(vector<Vec4f>lines3);float k4;vector<Point2f>linesk4;for(unsigned int d=0;d<lines3.size();d++){k4=(double)(lines3[d][3]-lines3[d][1])/(double)(lines3[d][3]-lines3[d][1]);}if(k4==1){}putText(dste,"crossing",Point(205,100),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);imshow("output3",dste);waitKey(0);return 0;}
第二版代码使用了ROI,使得阈值不需要太大从而大大的提升了代码效率。
