在 RGB RAW 文件上使用 fread 后如何在 4D 矩阵上使用重塑?

How to use reshape on a 4D matrix after using fread on a RGB RAW file?

以下代码正确加载了一个 mp4 文件并将其存储在 3D 矩阵中。

r = 1;
fileName = testDummyMP4;

readerobj = VideoReader(fileName, 'tag', 'myreader1');
F = get(readerobj, 'numberOfFrames');

tampon = single(read(readerobj,1));
tampon = imresize(tampon(:,:,1),r);
I = zeros(size(tampon,1),size(tampon,2),F,'uint8');

for k = 1:F
    disp(['Open: ' num2str(round(100*k/F)) '%'])
    vidFrames = single(read(readerobj,k));
    I(:,:,k) = imresize(vidFrames(:,:,2),r);
end;

imagesc((I(:,:,1)));

这是输出

我正在尝试对这段代码进行逆向工程,以便它为 .raw 8 位 rbg 文件生成相同类型的结果。根据 this 问题的答案,我尝试了以下操作:

您可以下载 'M1302000245_1436389857.982603.raw' rbg 文件 here 或 Google 驱动器版本 here

Ix = 256;
Iy = 256;
SF = 30; % Sample frequency
RecordingTime = 30; 
Iz = SF*RecordingTime
testDummy = 'M1302000245_1436389857.982603.raw'

fin = fopen(testDummy, 'r');
I = fread(fin, Ix*Iy*3*Iz, 'uint8');
fclose(fin);
I = reshape(I, [Ix Iy 3 Iz]); % The rbg should be 256x256x3x900

% I've tried each of the following manipulations before calling imagesc to no avail
% I = flipdim(imrotate(I, -90),2);
% I=impixel(I)
% I=I'

imagesc((I(:,:,1))); % view first slice

这给出:

我做错了什么?

附加信息: 使用 raspberry pi 相机和以下 python 代码

进行录制
class BrainCamera:
    def __init__(self):
        self.video_format = "rgb"
        #self.video_quality = 5

        # Set up the settings of the camera so that
        # Exposure and gains are constant.
        self.camera = picamera.PiCamera()
        self.camera.resolution = (256,256)
        self.camera.framerate = 30
        sleep(2.0)
        self.camera.shutter_speed = self.camera.exposure_speed
        self.camera.exposure_mode = 'off'
        g = self.camera.awb_gains
        self.camera.awb_mode = 'off'
        self.camera.awb_gains = g
        self.camera.shutter_speed = 30000
        self.camera.awb_gains = (1,1)

    def start_recording(self, video_name_path):
        self.camera.start_recording(video_name_path, format=self.video_format)
        self.camera.start_preview()

    def stop_recording(self):
        self.camera.stop_recording()
        self.camera.stop_preview()

    # Destructor
    def __del__(self):
        print ("Closed Camera")
        self.camera.close()

我没有得到你的输出,但我得到了一些合理的图像:

%your vode from above, ending with I=fread(...)
I=uint8(I)
I2=reshape(I, 3, Ix ,Iy, []);
I2=permute(I2,[3,2,1,4]);
imagesc(I2(:,:,:,1));
implay(I2);

在 Daniel 的帮助下,我完成了以下工作。此外,一位同事发现了如何获取 .raw rbg 视频的帧数。这是我们需要的,因为事实证明假设 noFrame = SF*RecordingTime 是个坏主意。

testDummy = 'M1302000245_1436389857.982603.raw'
testDummyInfo = dir(testDummy);
noFrames = testDummyInfo.bytes/(256*256*3); % In my question Iz = noFrames
fin = fopen(testDummy, 'r');
I = fread(fin, testDummyInfo.bytes, 'uint8');
fclose(fin);
I=uint8(I);
I2=reshape(I, 3, Ix ,Iy, noFrames);
I2=permute(I2,[3,2,1,4]);
imagesc(I2(:,:,2,1)); % Throw out unnecessarry channels r and b. Only want GFP signal

生产: