首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POCO M3中的摄像机返回不可读的图像字节

POCO M3中的摄像机返回不可读的图像字节
EN

Stack Overflow用户
提问于 2022-07-22 07:39:28
回答 1查看 38关注 0票数 0

我在试着在颤音中探测面部ml_kit_face_detection。对其他手机来说很好。但在POCO M3 ml试剂盒中无法检测到面部。

我从相机里拿出一张照片,然后保存到文件里。文件如下:https://drive.google.com/file/d/1mvt2klSwWFA5YL96bz1itfeEX4dai4Oh/view?usp=sharing

我知道这个文件是不可读的。我试着把它转换成base64,但是它也没有可读性。

我正试着把它转换成png &明白了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-22 11:29:48

逆向工程格式很有挑战性..。

文件格式是原始二进制格式,带有一些非标准的填充。

我设法得到了以下结果:

它看起来是对的,但我不确定它是否完全正确.

看起来文件格式是NV12 (或NV21),带有一些填充。

为了更好地理解NV12格式,您可以参考我的以下职位

通过反向工程文件,我发现了以下信息:

图像分辨率: 1280x720

存储的分辨率为1536x720 (右侧有256像素的填充)。

文件存储格式(原始二进制格式):

  • Y通道平面:第一个1536x719+720字节。
  • UV通道平面: 1536x360字节。
  • 备用字节,并复制UV通道平面。 我不知道为什么紫外线通道会被复制,但是数据看起来是一样的。

说明:

代码语言:javascript
复制
                     256 padding bytes
                   <----->
        1536 bytes
<------------------------>
YYYYYYYYYYYYYYYYYY00000000
YYYYYYYYYYYYYYYYYY00000000
YYYYYYYYYYYYYYYYYY00000000   719 rows
YYYYYYYYYYYYYYYYYY00000000
YYYYYYYYYYYYYYYYYY00000000
YYYYYYYYYYYYYYYYYY   <--- 1280 bytes (last row of Y)
UVUVUVUVUVUVUVUVUV00000000
UVUVUVUVUVUVUVUVUV00000000  359 rows
UVUVUVUVUVUVUVUVUV00000000
UVUVUVUVUVUVUVUVUV   <---- 1280 bytes (last row of UV)

读取数据并转换为RGB的MATLAB代码:

代码语言:javascript
复制
f = fopen('photo', 'r');  % Open binary file for reading.
I1 = fread(f, [1536, 719], '*uint8')'; % Read 1536x719 image (Y channel).
I1last_row = fread(f, 1280, '*uint8')'; % Read 1280 bytes (last row of Y).
I2 = fread(f, [1536, (720-1)/2], '*uint8')'; % Read 1536x359 image (UV channel).
I2last_row = fread(f, 1280, '*uint8')'; % Read 1280 bytes (last row of UV). 
fclose(f);
%figure;imshow(I1);impixelinfo % Show I1 for testing.
%figure;imshow(I2);impixelinfo % Show I2 for testing.

I1 = I1(:, 1:1280); % Crop valid part: 1280x719 pixels.
I1 = [I1; I1last_row]; % Add last row to the bottom (complete to 1280x720).

I2 = I2(:, 1:1280); % Crop valid part (1280x359 UV elements).
I2 = [I2; I2last_row]; % Add last row to the bottom. (complete to 1280x360).

% Convert from NV12 to RGB:
Y = I1;
U = I2(:, 1:2:end); % Extract U color channel 
V = I2(:, 2:2:end); % Extract V color channel 
U = imresize(U, size(Y)); % Resize U to be the same size of Y
V = imresize(V, size(Y)); % Resize V to be the same size of Y
YUV = cat(3, Y, U, V); % Merge Y,U,V channels
RGB = ycbcr2rgb(YUV); % Convert from YCbCr color format to RGB.

% Show and save RGB for testing:
figure;imshow(RGB);impixelinfo 
imwrite('RGB', RGB);

注意:

  • 为了更好地理解格式(NV12或NV21),我建议您用各种颜色拍摄一张照片。发布原始文件,如果可以的话,发布一个彩色参考图像进行比较。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73076773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档