【发布时间】:2017-10-23 23:18:15
【问题描述】:
我想使用 pdollar 工具箱阅读视频。我尝试应用 acfDetect 分类器的视频文件很少。但是,我没有得到正确的输出。在检查时,我发现框架(矩阵)的数据不匹配,对于 Matlab 和 Octave。附上的图片,这个问题就很清楚了。我试图打印框架的值,这就是我得到的:
Matlab 输出:
八度输出:
作为一次试验,我看到将 Octave 值乘以 255(RGB 最大值)可以得到一个近似于 Matlab 值的值。但是当我这样做时,我收到以下错误:
> >> runonVideos
processing 11-50-48--11-50-58_resized.mp4 ...
error: rgbConvertMex: For floats all values in I must be smaller than 1.
error: called from
rgbConvert at line 80 column 2
chnsPyramid at line 133 column 2
acfDetect_modified>acfDetectImg at line 74 column 2
acfDetect_modified at line 41 column 19
pedestrianDetection at line 33 column 11
runonVideos at line 8 column 5
基本上,Matlab 得到相同的值 (0-255),但对于此处所述的函数没有给出任何此类错误:rgbConvertMex。我无法理解问题到底出在哪里。
如果我能得到和Matlab中一样的值,我的问题将在很大程度上得到解决。
Octave 代码在这里:
> % Output text file
outFile = fopen(['C:\devwork\matlab\boosted\detection\',videoFname(1:end-4),'_detections.txt'],'w+');
% videoPlayer = vision.VideoPlayer;
vObj = VideoReader('C:\devwork\matlab\boosted\resizedVideos\11-50-48--11-50-58_resized.mp4');
%fprintf vObj;
% videoFwriter = vision.VideoFileWriter('result3_newAnnLdcf+.mp4','FileFormat','MPEG4','FrameRate',vObj.FrameRate);
tic
while hasFrame(vObj)
frame = readFrame(vObj);
%fprintf(frame);
% frame = imresize(frame,0.5);
bbs = acfDetect_modified(frame,detector);
% displayFrame = frame;
bbs = bbs(:,1:4);
bbs = round(bbs);
% if ((bbs(1,:) >= 1152) || (bbs(2,:) >= 648))
% disp('BB exceeds bounds')
% disp(bbs)
% end
% displayFrame = insertShape(displayFrame,'Rectangle',bbs,'LineWidth',2,'Color','red');
fprintf(outFile,'%d ',reshape(bbs,numel(bbs),1));
fprintf(outFile,'\n');
% videoPlayer.step(displayFrame);
% step(videoFwriter,displayFrame);
end
toc
fclose(outFile);
fprintf('done \n');
% release(videoPlayer);
% release(videoFwriter);
end
编辑 1:在 Matlab 中,我尝试将 v=v*255 更改为 v=uint8(v) 但现在我将所有值都设为 0 或 1。
编辑 2:
编辑 3:按照建议,Octace 中的代码行 31 更改为:v=uint8(v*255);
这确实给出了整数的结果,但它们仍然与 Matlab 的不同。我猜这一定是我的乘法因子 255 有问题。但这仍然没有解决。
【问题讨论】:
-
如果您注意到,MATLAB 数组的类型是
uint8。 -
@beaker 我确实注意到了。这是一个无符号位。但如果 matlab 采用这个,为什么不采用 Octave?
-
我不知道。但是如果在乘以 255 后将数组转换为 Octave 中的
uint8,它可能会起作用。 -
@beaker 这正是我所做的,但它给出了一个错误。再次检查问题是否有错误。
-
uint8仅将float转换为整数。我的猜测是图像中的像素值介于 0 和 1 之间,当转换为整数时,它会为您提供一个由 0 和 1 组成的矩阵。因此,您需要添加将值乘以 255 的行。加载图像时,检查图像的min和max值以验证像素强度落入的范围。
标签: matlab image-processing octave