任务描述:对图片上的五个小球进行识别以及建立坐标系进行测距
    用到的知識

    • 小孔成像
    • 小球的42mm与17mm的比例区别
    • 勾股定理計算距離
    • 坐標轉換
    • 霍夫線變換和霍夫圓變換

    思路
    1、通過百度搜索得出相機成像原理爲小孔成像
    設物體實際長度爲X,相機焦距爲f,物體在圖片中長度爲P,物體到相機的距離爲D
    得到公式:D=(f*X)/P
    2、圖片在經過預處理後通過霍夫圓變換找出目標的5個小球。
    3、代入數據到上面的公式中得到小球距相機的直線距離
    4、根據勾股定理計算出小球距離相機的水平距離。
    5、得出桌子長度作爲俯視圖的坐標軸y軸
    6、通過霍夫線變換找到斜率最大得線作爲x軸
    7、畫出俯視圖
    image.jpeg
    image.jpeg
    image.jpeg

    1. #include<iostream>
    2. #include<sstream>
    3. #include<math.h>
    4. #include<opencv2/opencv.hpp>
    5. #include<opencv2/imgproc/imgproc.hpp>
    6. #include<opencv2/highgui/highgui.hpp>
    7. using namespace std;
    8. using namespace cv;
    9. int main(){
    10. Mat srcImage,dstImage1,dstImage2,drawingImage;
    11. int x1=17,x2=42;
    12. float focal=435.675;
    13. float Distance,planedistance,Camhigh=20.0;
    14. float tabledistance,tablelong=100.0,Camdistance=60.0;
    15. tabledistance=sqrt(pow(Camdistance,2)-pow(Camhigh,2))*10;
    16. cout<<tabledistance<<endl;
    17. cout<<tablelong*10<<endl;
    18. int Coefficient=(int)(x2/x1);
    19. Point dis;
    20. Point s;
    21. vector<Vec3f>circles;
    22. vector<Vec2f>lines;
    23. drawingImage=Mat::zeros(Size(tablelong*10,tabledistance),CV_8UC3);
    24. srcImage=imread(/home/ma/下载/renwu52.jpg);
    25. cvtColor(srcImage,dstImage1,COLOR_BGR2GRAY);
    26. GaussianBlur(dstImage1,dstImage1,Size(5,5),3,3);
    27. Canny(dstImage1,dstImage2,3,9,3);
    28. HoughLines(dstImage2,lines,1,CV_PI/180,150,0,0);
    29. for(auto i=0;i<lines.size();i++){
    30. float k;
    31. k = (double)(lines[i][3] - lines[i][1]) / (double)(lines[i][2] - lines[i][0]);
    32. }
    33. HoughCircles(dstImage2,circles,HOUGH_GRADIENT,1,40,105,30,8,51);
    34. for(auto i=0;i<circles.size();i++){
    35. Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
    36. int radius=cvRound(circles[i][2]);
    37. dis.x=center.x;
    38. dis.y=center.y-30;
    39. s.x=center.x-50;
    40. s.y=center.y-30;
    41. if(radius!=18&&radius!=35){
    42. circle(srcImage,center,radius,Scalar(155,50,255),3,8,0);
    43. if(radius==19)
    44. {
    45. Distance=focal*x1/radius;
    46. planedistance=sqrt(pow(Distance,2)-pow(Camhigh,2));
    47. String Adistance;
    48. Point Acenter;
    49. Acenter.x=center.x;
    50. Acenter.y=tabledistance-planedistance;
    51. Adistance=to_string(Distance/10);
    52. putText(srcImage,S=,s,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    53. putText(srcImage,Adistance,dis,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    54. circle(drawingImage,Acenter,17,Scalar(0,0,255),1,8,0);
    55. cout<<Adistance<<endl;
    56. cout<<Acenter<<endl;
    57. cout<<radius<<endl;
    58. cout<<平面<<planedistance<<endl;
    59. }else if(radius==21)
    60. {
    61. String Bdistance;
    62. Distance=focal*x1/radius;
    63. planedistance=sqrt(pow(Distance,2)-pow(Camhigh,2));
    64. Point Bcenter;
    65. Bcenter.x=center.x;
    66. Bcenter.y=tabledistance-planedistance;
    67. Bdistance=to_string(Distance/10);
    68. putText(srcImage,S=,s,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    69. putText(srcImage,Bdistance,dis,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    70. circle(drawingImage,Bcenter,17,Scalar(0,0,255),1,8,0);
    71. cout<<Bdistance<<endl;
    72. cout<<平面<<planedistance<<endl;
    73. }
    74. else if(radius==40)
    75. {
    76. Distance=focal*x2/radius;
    77. planedistance=sqrt(pow(Distance,2)-pow(Camhigh,2));
    78. String Cdistance;
    79. Point Ccenter;
    80. Ccenter.x=center.x;
    81. Ccenter.y=tabledistance-planedistance;
    82. Cdistance=to_string(Distance/10);
    83. putText(srcImage,S=,s,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    84. putText(srcImage,Cdistance,dis,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    85. circle(drawingImage,Ccenter,42,Scalar(0,0,255),1,8,0);
    86. cout<<Cdistance<<endl;
    87. cout<<平面<<planedistance<<endl;
    88. }
    89. else if(radius==16)
    90. {
    91. Distance=focal*x1/(radius+Coefficient);
    92. planedistance=sqrt(pow(Distance,2)-pow(Camhigh,2));
    93. String Ddistance;
    94. Point Dcenter;
    95. Dcenter.x=center.x;
    96. Dcenter.y=tabledistance-planedistance;
    97. Ddistance=to_string(Distance/10);
    98. putText(srcImage,S=,s,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    99. putText(srcImage,Ddistance,dis,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    100. circle(drawingImage,Dcenter,17,Scalar(0,0,255),1,8,0);
    101. cout<<Ddistance<<endl;
    102. cout<<平面<<planedistance<<endl;
    103. }
    104. else if(radius==50)
    105. {
    106. Distance=focal*x2/(radius+Coefficient*4);
    107. planedistance=sqrt(pow(Distance,2)-pow(Camhigh,2));
    108. Point Ecenter;
    109. Ecenter.x=center.x;
    110. Ecenter.y=tabledistance-planedistance;
    111. String Edistance;
    112. Edistance=to_string(Distance/10);
    113. putText(srcImage,S=,s,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    114. putText(srcImage,Edistance,dis,FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2,LINE_AA);
    115. circle(drawingImage,Ecenter,42,Scalar(0,0,255),1,8,0);
    116. cout<<Edistance<<endl;
    117. cout<<平面<<planedistance<<endl;
    118. }
    119. }
    120. }
    121. imshow(dst,srcImage);
    122. imshow(drawing,drawingImage);
    123. waitKey(0);
    124. return 0;
    125. }