如何从 Matlab imaq.VideoDevice step() 输出中获取像素颜色
How to get pixel color from Matlab imaq.VideoDevice step() output
我在 imaq.VideoDevice 中使用 step(),但找不到 step() 输出格式的描述。我正在使用红外热像仪,想过滤特定的温度范围。
所以,我想在每一帧上使用 step(),然后在帧中搜索特定热范围内的像素。显然也需要知道每个像素的 X、Y。
我的目标是过滤帧中的像素并仅保留所需温度范围内的像素。
您可能需要从红外摄像头获取有关温度和颜色的信息。查看它可能说哪些值对应于哪些像素值的文档。那时你只需为每一帧创建一个蒙版。像这样(假设红外相机的值是“灰度”,意味着只有一个通道)
highest_temp = 200; %just a random number
lowest_temp = 50;
my_mask = (im <= higest_Temp) & (im >= loest_temp);
my_mask
是一个逻辑数组,当像素超出范围时为 0,当像素在范围内时为 1(真)。如果你想将蒙版应用于图像,只需将它们相乘(并注意单位,这里我假设红外摄像机小于 16 位)
masked_im = uint16(im .* double(mask));
我也会使用触发功能而不是 step
如果我没记错的话,默认情况下触发操作应该只需要 1 image/frame。所以制作一个循环,抓取一个帧,进行处理,然后一遍又一遍地转到下一个循环迭代。希望有帮助
回答:
step() 输出 ROW X COLUMN X pixel_color
其中 pixel_color = 索引 1 是像素中的红色数量。
pixel_color = 索引 2 是像素中的绿色数量。
pixel_color = 索引 3 是像素中的蓝色量。
例如,对于 X 处像素的颜色,Y = 5,10 = 第 5 行,第 10 列
然后:
红色的数量 = (5, 10, 1)
绿色量 = (5, 10, 2)
蓝色的数量是 = (5, 10, 3)
显示带有红色列和绿色行的框架的示例用法......
% 获取视频帧:
负载('handshakeStereoParams.mat');
videoFileLeft = 'handshake_left.avi';
readerLeft = vision.VideoFileReader(videoFileLeft, 'VideoOutputDataType', 'uint8');
frameLeft = readerLeft.step();
live_scene_player = vision.VideoPlayer('Position', [20, 600, 850, 500], 'Name','LEFT');
% 在图像的第 10 行制作绿色水平条纹:
frameLeft(10,:,1)=0; % 从条纹中去除红色
frameLeft(10,:,2)=255; % 开启全绿
frameLeft(10,:,3)=0; % 从条纹中去除蓝色
% 在图像的第 10 列制作红色水平条纹:
frameLeft(:,10,1)=255; % 从条纹中去除红色
frameLeft(:,10,2)=0; % 开启全绿
frameLeft(:,10,3)=0; % 从条纹中去除蓝色
% 显示它:
步骤( live_scene_player, frameLeft); % 最初来自 frameLeftRect
我在 imaq.VideoDevice 中使用 step(),但找不到 step() 输出格式的描述。我正在使用红外热像仪,想过滤特定的温度范围。
所以,我想在每一帧上使用 step(),然后在帧中搜索特定热范围内的像素。显然也需要知道每个像素的 X、Y。
我的目标是过滤帧中的像素并仅保留所需温度范围内的像素。
您可能需要从红外摄像头获取有关温度和颜色的信息。查看它可能说哪些值对应于哪些像素值的文档。那时你只需为每一帧创建一个蒙版。像这样(假设红外相机的值是“灰度”,意味着只有一个通道)
highest_temp = 200; %just a random number
lowest_temp = 50;
my_mask = (im <= higest_Temp) & (im >= loest_temp);
my_mask
是一个逻辑数组,当像素超出范围时为 0,当像素在范围内时为 1(真)。如果你想将蒙版应用于图像,只需将它们相乘(并注意单位,这里我假设红外摄像机小于 16 位)
masked_im = uint16(im .* double(mask));
我也会使用触发功能而不是 step
如果我没记错的话,默认情况下触发操作应该只需要 1 image/frame。所以制作一个循环,抓取一个帧,进行处理,然后一遍又一遍地转到下一个循环迭代。希望有帮助
回答: step() 输出 ROW X COLUMN X pixel_color 其中 pixel_color = 索引 1 是像素中的红色数量。 pixel_color = 索引 2 是像素中的绿色数量。 pixel_color = 索引 3 是像素中的蓝色量。
例如,对于 X 处像素的颜色,Y = 5,10 = 第 5 行,第 10 列 然后: 红色的数量 = (5, 10, 1) 绿色量 = (5, 10, 2) 蓝色的数量是 = (5, 10, 3)
显示带有红色列和绿色行的框架的示例用法......
% 获取视频帧: 负载('handshakeStereoParams.mat'); videoFileLeft = 'handshake_left.avi'; readerLeft = vision.VideoFileReader(videoFileLeft, 'VideoOutputDataType', 'uint8'); frameLeft = readerLeft.step(); live_scene_player = vision.VideoPlayer('Position', [20, 600, 850, 500], 'Name','LEFT');
% 在图像的第 10 行制作绿色水平条纹: frameLeft(10,:,1)=0; % 从条纹中去除红色 frameLeft(10,:,2)=255; % 开启全绿 frameLeft(10,:,3)=0; % 从条纹中去除蓝色
% 在图像的第 10 列制作红色水平条纹: frameLeft(:,10,1)=255; % 从条纹中去除红色 frameLeft(:,10,2)=0; % 开启全绿 frameLeft(:,10,3)=0; % 从条纹中去除蓝色
% 显示它: 步骤( live_scene_player, frameLeft); % 最初来自 frameLeftRect