【问题标题】:Reading frame after converting Matlab pdollar toolbox code to Octave将 Matlab pdollar 工具箱代码转换为 Octave 后的阅读框架
【发布时间】: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 的行。加载图像时,检查图像的 minmax 值以验证像素强度落入的范围。

标签: matlab image-processing octave


【解决方案1】:

您要查找的函数是im2uint8,它由image 包提供。

这可以在 [0,1] 范围内获取 double 类的输入,并将其转换为 uint8 图像,相应的值在 [0,255] 范围内。

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 2020-05-31
    • 1970-01-01
    • 2012-04-08
    • 2011-11-12
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多