背景

文章初衷:帮助读者更好理解MATLAB调用摄像头的方法

文章目的:根据Matlab deep learning一书中的第一章源代码,改造GUI,加入调用摄像头,实现实时去雾效果

准备工作

源代码

 首先需要准备《Matlab deep learning》一书中的第一章源代码,在Matlab中打开源代码。

安装插件

 安装两个插件,分别是usbwebcamsosgenericvideointerface

查看摄像头

 在以上准备工作完成后,打开下图所示位置的APP选项


 随后,在里面找到Image Acquisition Explorer打开,如下图所示

 如果能正常打开摄像头,如下图所示,那么恭喜你,前期准备完成!

理解原理

 将摄像头的每一帧画面导出,然后使用循环对每一帧进行去雾处理,并在axes上面显示,从而实现实时去雾处理的效果。

代码实现

将摄像头引入程序

 将如下代码加入到MainFormFileOpen_Callback函数中,注意,将整个函数的内容替换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 设定全局变量video
global video;

imaqhwinfo
% 将摄像头录像引入到obj
obj = videoinput("winvideo",1,"YUY2_640x480");
video = obj;
handles.obj = obj;
InitFig(hObject, handles);
% 准备在axes1上进行显示,注意,如果你不想在axes显示画面,可以设置在其他地方显示。
axes(handles.axes1);
% 对摄像头录像视频进行一些处理
vidRes1=get(obj,'VideoResolution');
nBands1=get(obj,'NumberOfBands');
set(obj,'ReturnedColorSpace','rgb');
handles.Img1 = 1;
% 在axes1上进行显示
himage1=imshow(zeros(vidRes1(2),vidRes1(1),nBands1));
preview(obj,himage1);

 完成以上设定,在运行程序打开菜单中 文件 的 打开,可以发现摄像头画面在axes1显示,效果大致如下图所示。

实现对每帧进行去雾处理

 选择一个你喜欢的去雾算法,本文中选取的去雾算法是Retinex理论去雾算法
 以Retinex理论去雾算法为例,打开MainFormRetinexDeFog_Callback函数,将如下代码替换原内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
% 设定全局变量video
global video;
% 判断video是否有摄像头录像
if isequal(video, 0)
msgbox('请载入图像!', '提示信息');
return;
end

obj = video;
InitFig(hObject, handles);
axes(handles.axes1);
vidRes1=get(obj,'VideoResolution');
nBands1=get(obj,'NumberOfBands');
set(obj,'ReturnedColorSpace','rgb');
himage1=imshow(zeros(vidRes1(2),vidRes1(1),nBands1));
preview(obj,himage1);

while true % 关键点
try
obj = video;
frame = getsnapshot(obj); % 从摄像头读取一帧
if isempty(frame)
break; % 如果摄像头没有帧,退出循环
end

Img2 = RemoveFogByRetinex(frame, 0); % 将抽出的帧进行Retinex理论处理,得到Img2图像
handles.Img2 = Img2;
axes(handles.axes1); % axes1显示原图
imshow(frame, []);
axes(handles.axes2); % axes2显示处理后图像,形成对照
imshow(Img2, []);
guidata(hObject, handles);
set(handles.textInfo, 'String', ...
'基于RETINEX理论去雾算法。');

catch ME
disp(ME.getReport());
break;
end
end

最终效果

 使用Retinex理论算法的最终效果如下图所示,如果不喜欢这个去雾算法,也可以选择其他去雾算法进行处理,实时处理视频帧的原理都是一样的。