我目前有一段Matlab代码,可以从两个网络摄像头中获取图像,叠加它们并在一个图形中显示,该图形会按时间间隔更新以提供半实时的效果。然而,现在我需要实时地完成这个过程,请问有没有人知道如何像3D电影那样叠加两个网络摄像头的流?
谢谢!
我目前有一段Matlab代码,可以从两个网络摄像头中获取图像,叠加它们并在一个图形中显示,该图形会按时间间隔更新以提供半实时的效果。然而,现在我需要实时地完成这个过程,请问有没有人知道如何像3D电影那样叠加两个网络摄像头的流?
谢谢!
如果您指的是立体眼镜 3D,拥有两张图像,您可以执行以下操作:
left = imread('vipstereo_hallwayLeft.png');
right = imread('vipstereo_hallwayRight.png');
imshow(cat(3, left(:,:,1), right(:,:,2:3)));
这两个png文件已经包含在图像处理工具箱中。
结果将是这样的(您可以使用红/青眼镜观看。我试过了!):
我已经用真实的照片尝试了两种方法:
1. 用两个不同的相机同时拍摄的两张略有偏移的照片;
2. 用移动相机在很短的时间内拍摄的两张照片。(连拍模式)
它们都给出了极好的结果。
然后,如果要使用两个网络摄像头进行操作,您需要执行以下步骤:
1. 正确初始化它们;
2. 将它们设置为每次触发获取1帧;
3. 触发它们并获取两个帧;
4. 混合帧并显示。
我没有两个网络摄像头,所以无法测试它,但我认为这段代码可以实现:
摄像头设置:
% Get a handle to each cam
Lvid = videoinput('winvideo', 1, 'YUY2_1280x1024');
Rvid = videoinput('winvideo', 2, 'YUY2_1280x1024');
% Set them to get one frame/trigger
Lvid.FramesPerTrigger = 1;
Rvid.FramesPerTrigger = 1;
然后执行一个无限循环来获取帧,混合它们并显示结果。
while(1)
% Trigers both video sources
start(Lvid);
start(Rvid);
% Get the frames
left = getdata(Lvid);
right = getdata(Rvid);
% Convert them to RGB
left = ycbcr2rgb(left);
right = ycbcr2rgb(right);
% mix them (R from right + GB from left)
frame = cat(3, left(:,:,1), right(:,:,2:3));
% show
imshow(frame);
pause(0.0001) % to refresh imshow
end