3D激光扫描三维重建——2.matlab读取校正参数,画面扭曲消除

  • 上一篇中我们通过matlab相机标定工具获得了Calib_Results.mat文件。
  • 先说一下这一篇的主要内容:matlab获取摄像头,录取6s的原始视频—>读取原始视频,对每一帧进行消扭处理,然后保存消扭后的帧—>读取消扭后的帧保存到文件夹,并合成视频。

1.读取摄像头:

  • A=imaqhwinfo(‘winvideo’);
    查看A的内容:DeviceID存储着电脑上所有可用摄像头的ID,每个ID对应一个摄像头。DeviceInfo中存储着每个摄像头的信息。(从我的这里可以看出,我的USB摄像头的ID是2)
    3D激光扫描三维重建——2.matlab读取校正参数,画面扭曲消除_第1张图片
    3D激光扫描三维重建——2.matlab读取校正参数,画面扭曲消除_第2张图片

  • vid = videoinput(‘winvideo’,2,’YUY2_640x480’);
    创建视频输入对象 ,第二个参数2是指DeviceID对应的第二个摄像头,第三个参数是我们需要的视频格式’YUY2_640x480’。

  • preview(vid)
    显示 至此可以看到我们指定摄像头的图像。

2.录视频,保存:

  • writerObj = VideoWriter( ‘camera_test.avi’ ) ; %创建视频文件
  • writerObj.FrameRate = N; %设置视频文件每秒钟的帧数
  • frame = getsnapshot(vid); %得到表示视频对象vid当前时刻画面的图像矩阵。 获取视频的一帧,一般这句写在循环里。

3.读取视频(读取帧),对每一帧消除扭曲并保存:

obj = VideoReader([filename '.avi']);  %读取视频
obj_numberofframe = obj.NumberOfFrame; %读取总的帧数
obj_framerate = obj.FrameRate;%读取帧速
obj_duration  = obj.Duration ;%读取视频总时长
for k=1:obj_numberofframe
    frame=read(obj,k);
    %imshow(frame); %显示帧
    imwrite(frame,strcat('E:\研究生文件\3D激光雷达\标定图片\','distort',num2str(k,'%04d'),'.jpg'),'jpg');% 保存帧
    %加载相机标定结果
    load('E:\研究生文件\3D激光雷达\标定图片\Calib_Results.mat')
    %读取上一句中的图片,此处需要对每一帧消除扭曲 调用my_undistort_image_no_read.m(matlab工具箱中的undistort_image_no_read.m修改版)
     my_undistort_image_no_read;
end

4.保存处理后的帧到指定文件夹,并合成视频

Files = dir(strcat('E:\\研究生文件\\3D激光雷达\\标定图片\\','undistort','*.jpg')); %读取文件中的基名是undistort,格式为jpg的图片
len=length(Files); %读取的文件个数
w_obj = VideoWriter('camera_test_undistort.avi');
w_obj.FrameRate = obj_framerate;
open(w_obj);
for i=1:len
    name=strcat('E:\研究生文件\3D激光雷达\标定图片\',Files(i).name);  %获得每一帧的文件名
    frame=imread(name);  
    imwrite(frame,strcat('E:\研究生文件\3D激光雷达\标定图片\视频消扭\',Files(i).name),'jpg');% 保存帧到指定文件夹
    imshow(frame);
    writeVideo(w_obj,frame);
end
close(w_obj);

参考链接:
http://www.cnblogs.com/alphashi/archive/2013/04/13/3019146.html

这里有几个我当时遇到的问题:

1.matlab以帧率30录出来6s的视频,出现快进的现象,即视频虽然是6s,但实际录得时间大于6s,以至于看到的6s视频是快进的。

  • 原因:getsnapshot函数获取的帧率很低。该函数在调用的时候作了一系列处理,包括连接设备、配置、开始采集、获取一帧图像,停止采集、关闭设备。因此获取一帧图像需要花相当长的时间。因此通常情况下直接调用该函数会存在帧率低的问题,现象就是直接采集+显示就会出现很卡的现象。(详细原因参考以下网址)
    http://blog.csdn.net/sxjk1987/article/details/8819186

  • 解决办法:帧率调低,一般22差不多。实际上matlab录视频的帧率是不固定的。

**2.存帧的时候命名为
strcat('E:\研究生文件\3D激光雷达\标定图片\','distort',num2str(k,'%04d'),'.jpg'),即结果是distort1.jpg、distort2.jpg……..distort100.jpg…….,但是在读取基名为distort,格式为jpg的图片时,最后合成的视频是乱序的,也就是图片读取乱序。**

  • 原因:通过单步调试,查看变量的变化,可以发现读取顺序是distort1、distort10、distort100、distort101…..这是因为读取的时候是按照字符串大小顺序读取的,每一个字符进行大小比较。
  • 解决办法:如果你有2位数的数量的图片时,按照基名+001的方式命名。strcat('E:\研究生文件\3D激光雷达\标定图片\','distort',num2str(k,'%04d'),'.jpg'),比如我有180张图片,则我的命名是用‘num2str(k,’%04d’)’这句实现的命名,结果是distort0001,distort0002…distort0180。这样读取的时候顺序就是正确的了。

最后附上代码:
http://pan.baidu.com/s/1bo0W04B

你可能感兴趣的:(3d激光重建,摄像头,matlab)