任务要求:识别图片上的方向信息并打印在终端上
以上为示例图片
任务思路:对图片进行滤波等几步预处理之后,在图片中寻找轮廓,将其轮廓包围获得一个包围图形,使用角点检测将其识别。
#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,使得阈值不需要太大从而大大的提升了代码效率。