回答

收藏

[原创] 【Khadas VIM试用】双目视觉运行能力测试1

#拆解/开源硬件 #拆解/开源硬件 4783 人阅读 | 0 人回复 | 2018-02-08

(一)双目视觉
双目视觉是深度是视觉的一种,通过两个摄像机的视图差求解空间中的坐标位置。
双目视觉的使用一般要经过几个流程:
双目摄像头的畸变标定-位置姿态标定-特征点匹配-根据视图差求解特征点景深信息-通过插值方法推出整幅图片的深度信息。
后面三个工作相对容易,可以由opencv实现,而且想要应用必须用opencv实现,前面的畸变标定、位置姿态标定则可以通过现成工具进行。

(二)畸变标定、位置姿态标定方案
与双目视觉死磕一年多,感慨良多。
一开始是使用ros系统的calibrate包标定畸变与位姿,参考的是西班牙工程师写的《ROS机器人操程序设计》的例程,为此还专门买了这本书来看,结果死磕了两个学期(包含两个假期)之后,无奈放弃。无他,学习了两个学期我才终于把书本例程里面的畸变标定部分修改正确并完成标定,剩下的位姿标定部分无论我如何绞尽脑汁,都没办法找到程序的bug在哪,一直警告我左右摄像头的图像未发布,以前一开始研究的时候还以为是因为例程使用的是indogo而我用ubuntu 16.04对应的kenetic的原因,自从我发现了畸变标定程序的bug后,我就再也不相信他的例程了。说起来他那本书看完感觉也没什么收获,说不上是一本好书,只不过是恰好ROS这一块参考书籍比较少罢了。
说了这么多,话说回来,前段时间我终于是决心放下坑爹的ROS,转向Matlab标定摄像头之路,果不其然,每个摄像头9张图片,标定了一个下午就完成了,ROS这个坑果然应该早点弃。

(三)图片获取
注意:先插左摄像头、后插右摄像头
  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>

  3. using namespace std;
  4. using namespace cv;

  5. int main()
  6. {
  7.     VideoCapture left(0);
  8.     VideoCapture right(1);

  9.     Mat left_frame,right_frame;

  10.     if(!left.isOpened() || !right.isOpened())
  11.     {
  12.     cout<<"open error"<<endl;
  13.     return -1;
  14.     }

  15.     char key;
  16.     int count = 0;
  17.     char filename[200];

  18.     namedWindow("video",1);
  19.     namedWindow("picture",1);

  20.     while(1)
  21.     {
  22.         key = waitKey(50);

  23.         left >> left_frame;
  24.         right >> right_frame;

  25.         imshow("left_video",left_frame);
  26.         imshow("right_video",right_frame);

  27.         if(key == 27)
  28.             break;//按ESC键退出程序
  29.         if(key == 32)//按空格键进行拍照
  30.         {
  31.             sprintf(filename,"picture2/left_%d.jpg",++count);
  32.             imwrite(filename,left_frame);//图片保存到本工程目录中
  33.             sprintf(filename,"picture2/right_%d.jpg",count);
  34.             imwrite(filename,right_frame);//图片保存到本工程目录中
  35.             //imshow("left_picture",left_frame);
  36.             //imshow("right_picture",right_frame);
  37.         }
  38.     }
  39.     return 0;
  40. }
复制代码
(四)标定
1、matlab双目标定工具箱:http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html
2、将其解压到Matlab的工作目录下,然后将其包含到matlab的工作路径下。
3、运行calib_gui就可以打开matlab标定工具箱主界面
4、选择第一个Standard,弹出界面Camera Calibration Toolbox
5、开始标定左摄像头,选择第一个Images names后,MATLAB命令行窗口会提示输入图片的basename以及各格式,由于我的图片明明是left_、right_形式的,因此这里填写left_
6、然后点击标定界面上的Extract grid corners,MATLAB命令界面显示然后一路回车键下去,直到显示图片,分别点击四个角落。

7、如果不满意自动产生的标定结果,可以在下图位置输入1,设置kc值,仍然不满意可以直接回车重新设置kc值(记住是直接回车,再次输入1表示确认kc值)

8、标定完一张图片后下一张继续

9、左摄像头标定结果出来后,点击Save,这时结果文件默认保存在之前放置标定图片的新建文件夹下面,默认文件名为Calib_Results.m,将其改为Calib_Results_left.mat(双目标定用到)。至此左摄像头标定结束,右摄像头标定过程与左一样,只是将Basename改为right,格式仍为jpg,然后回车回车,最后保存为Calib_Results_right.mat。

10、完成畸变标定后,进行位姿标定
命令行输入stereo_gui,弹出立体标定界面,选择第一个Load
如果之前左右摄像头结果你是按照之前的文件名保存的,那么直接在命令行以下两行后面两次回车


【Khadas VIM试用】双目视觉运行能力测试2

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条