当前位置:   article > 正文

自动驾驶AVM环视算法--任意角度的旋转算法实现_环视源码

环视源码

测试环境 

opencv310

vs2022

参考:金书世界

算法源码获取:

链接:https://pan.baidu.com/s/1YLE-uM1JaHCMqDndPfU01Q 提取码:m7rc 

算法的主要实现

1、实现三个坐标轴轴的旋转。

2、不同相机之间的拼接融合。

测试的输出效果图像

算法的实现过程

根据当前的相机参数在保证算法的实际效果的前提下设置旋转角度的范围

  1. AVMData.A_rx = 114; //[72 114]
  2. AVMData.A_ry = 0;//[0 360]
  3. AVMData.A_rz = 0;//[-20 20]

在绕车辆周围旋转时,由于车辆是长方形的,不能在在车周围圆形的旋转吗,所以当前的额 算法是按照椭圆的方式旋转路径。

  1. //椭圆a=4000,b=3000
  2. float aa = 5000; float bb = 4000;
  3. float qq = Data->A_ry * 3.1415927 / 180;
  4. Data->A.x = aa * sin(qq);
  5. Data->A.y = Data->CameraH_A;
  6. Data->A.z = -bb * cos(qq);
  7. Data->F.x = 0;
  8. Data->F.y = Data->CameraH_F;
  9. Data->F.z = (Data->FW + Data->BW) / 2;
  10. Data->B.x = 0;
  11. Data->B.y = Data->CameraH_B;
  12. Data->B.z = -(Data->FW + Data->BW) / 2;
  13. Data->L.x = -Data->LW;
  14. Data->L.y = Data->CameraH_B;
  15. Data->L.z = Data->F.z- Data->FW;
  16. Data->R.x = Data->RW;
  17. Data->R.y = Data->CameraH_B;
  18. Data->R.z = Data->F.z - Data->FW;

初始化相机的参数

  1. js_initAngle(Data->data_TOP_B, Data->A_rx, -Data->A_ry,-Data->A_rz); js_initAngleT(Data->data_TOP_B, Data->data_TOP_T_B);
  2. js_initAngle(Data->data_TOP_A, Data->A_rx, Data->A_ry,Data->A_rz); js_initAngle(Data->data_0_A, 0, 0, 0); js_initAngleT(Data->data_TOP_A, Data->data_TOP_T_A);
  3. js_initAngle(Data->data_0_F, 25, 0, 0);
  4. js_initAngle(Data->data_0_B, 25, 180, 0);
  5. js_initAngle(Data->data_0_L, 25, 90, 0);
  6. js_initAngle(Data->data_0_R, 25, -90, 0);

计算车辆的拼接交点位置

  1. js_pointf Psrc;
  2. js_3Dpointf Pdst_LF, Pdst_RF, Pdst_LB, Pdst_RB;
  3. Pdst_LF.x = Data->L.x;
  4. Pdst_LF.y = Data->CameraH_A;
  5. Pdst_LF.z = Data->F.z;// -Data->A.z;
  6. js_World2Plane(Data->data_TOP_A, Data->Aa, Pdst_LF, &Data->LFsrc, Data->Af, Data->Ac, Data->zc);
  7. Pdst_RF.x = Data->R.x;
  8. Pdst_RF.y = Data->CameraH_A;
  9. Pdst_RF.z = Data->F.z;// -Data->A.z;
  10. js_World2Plane(Data->data_TOP_A, Data->Aa, Pdst_RF, &Data->RFsrc, Data->Af, Data->Ac, Data->zc);
  11. Pdst_LB.x = Data->L.x;
  12. Pdst_LB.y = Data->CameraH_A;
  13. Pdst_LB.z = Data->B.z; //Data->A.z - Data->B.z;
  14. js_World2Plane(Data->data_TOP_A, Data->Aa, Pdst_LB, &Data->LBsrc, Data->Af, Data->Ac, Data->zc);
  15. Pdst_RB.x = Data->R.x;
  16. Pdst_RB.y = Data->CameraH_A;
  17. Pdst_RB.z = Data->B.z; //Data->A.z - Data->B.z;
  18. js_World2Plane(Data->data_TOP_A, Data->Aa, Pdst_RB, &Data->RBsrc, Data->Af, Data->Ac, Data->zc);

获取四个摄像头的图像数据(本测试使用的是opencv读取图像的方式实现的)

  1. IplImage* img_F = cvLoadImage("Front.png");
  2. IplImage* img_B = cvLoadImage("Back.png");
  3. IplImage* img_L = cvLoadImage("Left.png");
  4. IplImage* img_R = cvLoadImage("Right.png");

算法实现函数

js_getAVM_TOP(&AVMData, img_AVM->imageData, img_F->imageData, img_B->imageData, img_L->imageData, img_R->imageData, img_F->width, img_F->height, img_AVM->width, img_AVM->height, img_AVM->nChannels);

算法的图片的测试代码

  1. // TODO: 在此添加控件通知处理程序代码
  2. IplImage* img_AVM = cvCreateImage(cvSize(1080, 1080), 8, 3);
  3. IplImage* img_AVM_resize = cvCreateImage(cvSize(404, 720), 8, 3);
  4. IplImage* img_F = cvLoadImage("Front.png");
  5. IplImage* img_B = cvLoadImage("Back.png");
  6. IplImage* img_L = cvLoadImage("Left.png");
  7. IplImage* img_R = cvLoadImage("Right.png");
  8. IplImage* det_TOP_F = cvCreateImage(cvSize(img_F->width, img_F->height), img_F->depth, img_F->nChannels);
  9. IplImage* det_TOP_B = cvCreateImage(cvSize(img_B->width, img_B->height), img_B->depth, img_B->nChannels);
  10. IplImage* det_TOP_L = cvCreateImage(cvSize(img_L->width, img_L->height), img_L->depth, img_L->nChannels);
  11. IplImage* det_TOP_R = cvCreateImage(cvSize(img_L->width, img_L->height), img_L->depth, img_L->nChannels);
  12. CvVideoWriter* writer = cvCreateVideoWriter("G:\\CSDN\\AVM\\Video\\AVM_Angle.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, cvSize(1080, 1080));
  13. js_AVM_obj AVMData;
  14. AVMData.A_rx = 114; //[72 114]
  15. AVMData.A_ry = 0;//[0 360]
  16. AVMData.A_rz = 0;//[-20 20]
  17. //AVMData.A_rx = 90; //[72 114]
  18. //AVMData.A_ry = 450;//[0 360]
  19. //AVMData.A_rz = -20;//[-20 20]
  20. int stept_index = 0;
  21. while (1)
  22. {
  23. js_init_avm(&AVMData, img_AVM->width, img_AVM->height);
  24. js_getAVM_TOP(&AVMData, img_AVM->imageData, img_F->imageData, img_B->imageData, img_L->imageData, img_R->imageData, img_F->width, img_F->height, img_AVM->width, img_AVM->height, img_AVM->nChannels);
  25. //cvCircle(img_AVM, cvPoint(AVMData.LFsrc.x, AVMData.LFsrc.y), 3, CV_RGB(255, 0, 0), 3);
  26. //cvCircle(img_AVM, cvPoint(AVMData.RFsrc.x, AVMData.RFsrc.y), 3, CV_RGB(255, 0, 0), 3);
  27. //cvCircle(img_AVM, cvPoint(AVMData.LBsrc.x, AVMData.LBsrc.y), 3, CV_RGB(255, 0, 0), 3);
  28. //cvCircle(img_AVM, cvPoint(AVMData.RBsrc.x, AVMData.RBsrc.y), 3, CV_RGB(255, 0, 0), 3);
  29. switch (stept_index)
  30. {
  31. case 0://x轴
  32. AVMData.A_rx = AVMData.A_rx - 1;
  33. if (AVMData.A_rx == 72)
  34. {
  35. stept_index = 1;
  36. AVMData.A_ry = 0;
  37. }
  38. break;
  39. case 1://y轴
  40. AVMData.A_ry = AVMData.A_ry + 1;
  41. if (AVMData.A_ry == 450)
  42. {
  43. stept_index = 2;
  44. AVMData.A_rx = 90;
  45. AVMData.A_rz = -20;
  46. }
  47. break;
  48. case 2://z轴
  49. AVMData.A_rz = AVMData.A_rz + 1;
  50. if (AVMData.A_rz == 20)
  51. {
  52. stept_index = 3;
  53. }
  54. break;
  55. default:
  56. break;
  57. }
  58. if (stept_index == 3)break;
  59. cvShowImage("img", img_AVM);
  60. cvWriteFrame(writer, img_AVM);
  61. cvWaitKey(10);
  62. free(AVMData.Ftable);
  63. free(AVMData.Btable);
  64. free(AVMData.Ltable);
  65. free(AVMData.Rtable);
  66. }
  67. cvReleaseVideoWriter(&writer);
  68. cvWaitKey(0);

算法视频测试代码

  1. // TODO: 在此添加控件通知处理程序代码
  2. IplImage* img_AVM_all = cvCreateImage(cvSize(1280*2+1080, 1440), 8, 3);
  3. IplImage* img_AVM = cvCreateImage(cvSize(1080, 1440), 8, 3);
  4. IplImage* img_AVM_resize = cvCreateImage(cvSize(1200, 480), 8, 3);
  5. IplImage* det_TOP_F = cvCreateImage(cvSize(1280, 720), 8, 3);
  6. IplImage* det_TOP_B = cvCreateImage(cvSize(1280, 720), 8, 3);
  7. IplImage* det_TOP_L = cvCreateImage(cvSize(1280, 720), 8, 3);
  8. IplImage* det_TOP_R = cvCreateImage(cvSize(1280, 720), 8, 3);
  9. CvVideoWriter* writer = cvCreateVideoWriter("G:\\CSDN\\AVM\\Video\\AVM_Result1.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, cvSize(1280 * 2 + 1080, 1440));
  10. cvNamedWindow("视频播放", CV_WINDOW_AUTOSIZE);
  11. CvCapture* C_img_F = cvCreateFileCapture("G:\\CSDN\\AVM\\Video\\Front.avi");
  12. CvCapture* C_img_B = cvCreateFileCapture("G:\\CSDN\\AVM\\Video\\Back.avi");
  13. CvCapture* C_img_L = cvCreateFileCapture("G:\\CSDN\\AVM\\Video\\Left.avi");
  14. CvCapture* C_img_R = cvCreateFileCapture("G:\\CSDN\\AVM\\Video\\Right.avi");
  15. IplImage* img_F, *img_B, *img_L, *img_R;
  16. js_AVM_obj AVMData;
  17. AVMData.A_rx = 80; //[72 114]
  18. AVMData.A_ry = 0;//[0 360]
  19. AVMData.A_rz = 0;//[-20 20]
  20. js_init_avm(&AVMData, img_AVM->width, img_AVM->height);
  21. while (img_F = cvQueryFrame(C_img_F))
  22. {
  23. img_B = cvQueryFrame(C_img_B);
  24. img_L = cvQueryFrame(C_img_L);
  25. img_R = cvQueryFrame(C_img_R);
  26. js_getAVM_TOP(&AVMData, img_AVM->imageData, img_F->imageData, img_B->imageData, img_L->imageData, img_R->imageData, img_F->width, img_F->height, img_AVM->width, img_AVM->height, img_AVM->nChannels);
  27. cvSetImageROI(img_AVM_all, cvRect(0, 0, 1280, 720));
  28. cvCopy(img_F, img_AVM_all);
  29. cvResetImageROI(img_AVM_all);
  30. cvSetImageROI(img_AVM_all, cvRect(1280, 0, 1280, 720));
  31. cvCopy(img_B, img_AVM_all);
  32. cvResetImageROI(img_AVM_all);
  33. cvSetImageROI(img_AVM_all, cvRect(0, 720, 1280, 720));
  34. cvCopy(img_L, img_AVM_all);
  35. cvResetImageROI(img_AVM_all);
  36. cvSetImageROI(img_AVM_all, cvRect(1280, 720, 1280, 720));
  37. cvCopy(img_R, img_AVM_all);
  38. cvResetImageROI(img_AVM_all);
  39. cvSetImageROI(img_AVM_all, cvRect(1280*2, 0, 1080, 1440));
  40. cvCopy(img_AVM, img_AVM_all);
  41. cvResetImageROI(img_AVM_all);
  42. cvWriteFrame(writer, img_AVM_all);
  43. cvResize(img_AVM_all, img_AVM_resize);
  44. cvShowImage("视频播放", img_AVM_resize);
  45. char c = cvWaitKey(1);
  46. if (c == 27)break;
  47. }
  48. cvReleaseVideoWriter(&writer);
  49. cvReleaseCapture(&C_img_F);
  50. cvReleaseCapture(&C_img_B);
  51. cvReleaseCapture(&C_img_L);
  52. cvReleaseCapture(&C_img_R);
  53. cvDestroyWindow("视频播放");

测试效果的视频

AVM的实现的自由角度旋转

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号