任务要求:识别图片上的方向信息并打印在终端上
    微信图片_20210313081026.jpg微信图片_202103130810262.jpg微信图片_202103130810263.jpg微信图片_202103130810264.jpg
    以上为示例图片
    任务思路:对图片进行滤波等几步预处理之后,在图片中寻找轮廓,将其轮廓包围获得一个包围图形,使用角点检测将其识别。

    1. #include<opencv2/opencv.hpp>
    2. #include<opencv2/highgui/highgui.hpp>
    3. #include<opencv2/imgproc/imgproc.hpp>
    4. #include<iostream>
    5. using namespace cv;
    6. using namespace std;
    7. void on_CornerHarris(int, void*);
    8. int main(){
    9. Mat src,ROI1,graysrc,dst,dst1,img;
    10. src=imread("/home/ma/图片/mmexport1601205165349.jpg");
    11. imshow("原圖",src);
    12. ROI1=src(Rect(100,100,320,300));
    13. imshow("roi1",ROI1);
    14. blur(ROI1,graysrc,Size(3,6));
    15. cvtColor(graysrc,dst,COLOR_BGR2GRAY);
    16. Canny(graysrc,dst,100,200,3,false);
    17. cvtColor(dst,dst1,COLOR_GRAY2BGR);
    18. threshold(dst1,img,60,100,THRESH_BINARY);
    19. vector<Vec4f>lines;
    20. HoughLinesP(dst,lines,1,CV_PI/180,10,0,0);
    21. Scalar color=Scalar(0,0,255);
    22. for (size_t i = 0; i < lines.size(); i++)
    23. {
    24. Vec4f plines=lines[i];
    25. line(img,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color,3,LINE_AA);
    26. }
    27. putText(img,"Straight",Point(100,280),FONT_HERSHEY_COMPLEX, 1, Scalar(255,23,0),4,8);
    28. imshow("output",img);
    29. Mat src1,ROI2,src2,dst2,dst3,dst4,dst5;
    30. src1=imread("/home/ma/图片/mmexport1601200552742.jpg");
    31. imshow("原圖1",src1);
    32. ROI2=src1(Rect(100,100,320,300));
    33. blur(ROI2,src2,Size(3,3));
    34. cvtColor(src2,dst2,COLOR_BGR2GRAY);
    35. Canny(dst2,dst3,100,200,3,false);
    36. cvtColor(dst3,dst4,COLOR_GRAY2BGR);
    37. threshold(dst4,dst5,60,100,THRESH_BINARY);
    38. vector<Vec4f>lines1;
    39. HoughLinesP(dst3,lines1,1,CV_PI/180,10,0,0);
    40. Scalar color1=Scalar(0,0,255);
    41. for(size_t j=0; j < lines1.size(); j++)
    42. {
    43. Vec4f plines=lines1[j];
    44. line(dst5,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color1,3,LINE_AA);
    45. }
    46. putText(dst5,"leftturn",Point(80,50),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);
    47. imshow("output1",dst5);
    48. Mat src3,ROI3,dst6,dst7,dst8,dst9,dst10;
    49. src3=imread("/home/ma/下载/mmexport1601200550450.jpg");
    50. imshow("原圖2",src3);
    51. ROI3=src3(Rect(150,100,320,300));
    52. blur(ROI3,dst6,Size(2,4));
    53. cvtColor(dst6,dst7,COLOR_BGR2GRAY);
    54. Canny(dst7,dst8,100,200,3,false);
    55. cvtColor(dst8,dst9,COLOR_GRAY2BGR);
    56. threshold(dst9,dst10,60,100,THRESH_BINARY);
    57. vector<Vec4f>lines2;
    58. HoughLinesP(dst8,lines2,1,CV_PI/180,10,0,0);
    59. Scalar color2=Scalar(0,0,255);
    60. for(size_t k=0; k< lines2.size(); k++){
    61. Vec4f plines=lines2[k];
    62. line(dst10,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color2,3,LINE_AA);
    63. }
    64. putText(dst10,"rightturn",Point(100,260),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);
    65. imshow("output2",dst10);
    66. Mat src4,ROI4,dsta,dstb,dstc,dstd,dste;
    67. src4=imread("/home/ma/下载/mmexport1601200545676.jpg");
    68. imshow("原圖3",src4);
    69. ROI4=src4(Rect(150,20,380,330));
    70. blur(ROI4,dsta,Size(3,3));
    71. cvtColor(dsta,dstb,COLOR_BGR2GRAY);
    72. Canny(dstb,dstc,100,200,3,false);
    73. cvtColor(dstc,dstd,COLOR_GRAY2BGR);
    74. threshold(dstd,dste,60,100,THRESH_BINARY);
    75. vector<Vec4f>lines3;
    76. HoughLinesP(dstc,lines3,1,CV_PI/180,10,0,0);
    77. Scalar color3=Scalar(0,0,255);
    78. for(size_t z=0; z < lines3.size();z++){
    79. Vec4f plines=lines3[z];
    80. line(dste,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color3,3,LINE_AA);
    81. }
    82. putText(dste,"crossing",Point(205,100),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);
    83. imshow("output3",dste);
    84. waitKey(0);
    85. return 0;
    86. }

    以上为第一版代码,因为二值化的阈值调的太大导致代码效率很低。

    1. #include<opencv2/opencv.hpp>
    2. #include<opencv2/highgui/highgui.hpp>
    3. #include<opencv2/imgproc/imgproc.hpp>
    4. #include<iostream>
    5. using namespace cv;
    6. using namespace std;
    7. int main(){
    8. Mat src,ROI1,graysrc,dst,dst1,img;
    9. src=imread("/home/ma/图片/mmexport1601205165349.jpg");
    10. imshow("原圖",src);
    11. ROI1=src(Rect(100,100,320,300));
    12. blur(ROI1,graysrc,Size(3,3));
    13. cvtColor(ROI1,graysrc,COLOR_BGR2GRAY);
    14. Canny(graysrc,dst,100,200,3,false);
    15. cvtColor(dst,dst1,COLOR_GRAY2BGR);
    16. threshold(dst1,img,60,100,THRESH_BINARY);
    17. vector<Vec4f>lines;
    18. HoughLinesP(dst,lines,1,CV_PI/90,10,10,10);
    19. Scalar color=Scalar(0,0,255);
    20. for (size_t i = 0; i < lines.size(); i++)
    21. {
    22. Vec4f plines=lines[i];
    23. line(img,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color,3,LINE_AA);
    24. }
    25. vector<Point2f>getlines1(vector<Vec4f>lines);
    26. float k1;
    27. vector<Point2f>linesk1;
    28. for(unsigned int a=0;a<lines.size();a++){
    29. k1=(double)(lines[a][3]-lines[a][1])/(double)(lines[a][3]-lines[a][1]);
    30. }
    31. cout<<k1<<endl;
    32. if(k1==1){
    33. putText(img,"Straight",Point(100,280),FONT_HERSHEY_COMPLEX, 1, Scalar(255,23,0),4,8);
    34. }
    35. imshow("output",img);
    36. Mat src1,ROI2,src2,dst2,dst3,dst4,dst5;
    37. src1=imread("/home/ma/图片/mmexport1601200552742.jpg");
    38. imshow("原圖1",src1);
    39. ROI2=src1(Rect(100,100,320,300));
    40. blur(ROI2,src2,Size(3,3));
    41. cvtColor(src2,dst2,COLOR_BGR2GRAY);
    42. Canny(dst2,dst3,100,200,3,false);
    43. cvtColor(dst3,dst4,COLOR_GRAY2BGR);
    44. threshold(dst4,dst5,60,100,THRESH_BINARY);
    45. vector<Vec4f>lines1;
    46. HoughLinesP(dst3,lines1,1,CV_PI/180,10,0,10);
    47. Scalar color1=Scalar(0,0,255);
    48. for(size_t j=0; j < lines1.size(); j++)
    49. {
    50. Vec4f plines=lines1[j];
    51. line(dst5,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color1,3,LINE_AA);
    52. }
    53. vector<Point2f>getlines2(vector<Vec4f>lines1);
    54. float k2;
    55. vector<Point2f>linesk2;
    56. for(unsigned int b=0;b<lines1.size();b++){
    57. k2=(double)(lines1[b][3]-lines1[b][1])/(double)(lines1[b][3]-lines1[b][1]);
    58. }
    59. if(k2==1){
    60. putText(dst5,"leftturn",Point(80,50),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);
    61. }
    62. imshow("output1",dst5);
    63. Mat src3,ROI3,dst6,dst7,dst8,dst9,dst10;
    64. src3=imread("/home/ma/下载/mmexport1601200550450.jpg");
    65. imshow("原圖2",src3);
    66. ROI3=src3(Rect(150,100,320,300));
    67. blur(ROI3,dst6,Size(3,4));
    68. cvtColor(dst6,dst7,COLOR_BGR2GRAY);
    69. Canny(dst7,dst8,100,200,3,false);
    70. cvtColor(dst8,dst9,COLOR_GRAY2BGR);
    71. threshold(dst9,dst10,60,100,THRESH_BINARY);
    72. vector<Vec4f>lines2;
    73. HoughLinesP(dst8,lines2,1,CV_PI/180,10,0,15);
    74. Scalar color2=Scalar(0,0,255);
    75. for(size_t k=0; k< lines2.size(); k++){
    76. Vec4f plines=lines2[k];
    77. line(dst10,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color2,3,LINE_AA);
    78. }
    79. vector<Point2f>getlines2(vector<Vec4f>lines2);
    80. float k3;
    81. vector<Point2f>linesk3;
    82. for(unsigned int c=0;c<lines2.size();c++){
    83. k3=(double)(lines1[c][3]-lines1[c][1])/(double)(lines1[c][3]-lines1[c][1]);
    84. }
    85. if(k3==1){
    86. putText(dst10,"rightturn",Point(100,260),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);
    87. }
    88. imshow("output2",dst10);
    89. Mat src4,ROI4,dsta,dstb,dstc,dstd,dste;
    90. src4=imread("/home/ma/下载/mmexport1601200545676.jpg");
    91. imshow("原圖3",src4);
    92. ROI4=src4(Rect(150,20,380,330));
    93. blur(ROI4,dsta,Size(3,3));
    94. cvtColor(dsta,dstb,COLOR_BGR2GRAY);
    95. Canny(dstb,dstc,100,200,3,false);
    96. cvtColor(dstc,dstd,COLOR_GRAY2BGR);
    97. threshold(dstd,dste,60,100,THRESH_BINARY);
    98. vector<Vec4f>lines3;
    99. HoughLinesP(dstc,lines3,1,CV_PI/180,10,0,15);
    100. Scalar color3=Scalar(0,0,255);
    101. for(size_t z=0; z < lines3.size();z++){
    102. Vec4f plines=lines3[z];
    103. line(dste,Point(plines[0],plines[1]),Point(plines[2],plines[3]),color3,3,LINE_AA);
    104. }
    105. vector<Point2f>getlines2(vector<Vec4f>lines3);
    106. float k4;
    107. vector<Point2f>linesk4;
    108. for(unsigned int d=0;d<lines3.size();d++){
    109. k4=(double)(lines3[d][3]-lines3[d][1])/(double)(lines3[d][3]-lines3[d][1]);
    110. }
    111. if(k4==1){
    112. }
    113. putText(dste,"crossing",Point(205,100),FONT_HERSHEY_COMPLEX,1,Scalar(255,23,0),4,8);
    114. imshow("output3",dste);
    115. waitKey(0);
    116. return 0;
    117. }

    第二版代码使用了ROI,使得阈值不需要太大从而大大的提升了代码效率。