2024-04-17 02:37:04 -04:00
|
|
|
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
|
|
|
# SPDX-License-Identifier: Unlicense OR CC0-1.0
|
|
|
|
import argparse
|
|
|
|
|
|
|
|
import cv2 as cv
|
|
|
|
import numpy as np
|
|
|
|
from numpy.typing import NDArray
|
|
|
|
|
|
|
|
|
|
|
|
def open_picture(path): # type: (str) -> list[int]
|
|
|
|
with open(path, 'rb') as f:
|
|
|
|
data = f.read()
|
|
|
|
f.close()
|
|
|
|
new_data = [int(x) for x in data]
|
|
|
|
return new_data
|
|
|
|
|
|
|
|
|
|
|
|
def picture_show_rgb888(data, h, w): # type: (list[int], int, int) -> None
|
|
|
|
data = np.array(data).reshape(h, w, 3).astype(np.uint8)
|
|
|
|
cv.imshow('data', data)
|
|
|
|
cv.waitKey()
|
|
|
|
|
|
|
|
|
|
|
|
def picture_show_rgb565(data, h, w): # type: (list[int], int, int) -> None
|
|
|
|
|
|
|
|
new_data = [0] * ((len(data) // 2) * 3)
|
|
|
|
for i in range(len(data)):
|
|
|
|
if i % 2 != 0:
|
|
|
|
new_data[3 * (i - 1) // 2 + 2] = (data[i] & 0xf8)
|
|
|
|
new_data[3 * (i - 1) // 2 + 1] |= (data[i] & 0x7) << 5
|
|
|
|
else:
|
|
|
|
new_data[3 * i // 2] = (data[i] & 0x1f) << 3
|
|
|
|
new_data[3 * i // 2 + 1] |= (data[i] & 0xe0) >> 3
|
|
|
|
|
|
|
|
new_data = np.array(new_data).reshape(h, w, 3).astype(np.uint8)
|
|
|
|
cv.imshow('data', new_data)
|
|
|
|
cv.waitKey()
|
|
|
|
|
|
|
|
|
|
|
|
def picture_show_gray(data, h, w): # type: (list[int], int, int) -> None
|
|
|
|
new_data = np.array(data).reshape(h, w, 1).astype(np.uint8)
|
|
|
|
cv.imshow('data', new_data)
|
|
|
|
cv.waitKey()
|
|
|
|
|
|
|
|
|
|
|
|
def convert_YUV_to_RGB(Y, U, V): # type: (NDArray, NDArray, NDArray) -> tuple[NDArray, NDArray, NDArray]
|
|
|
|
B = np.clip(Y + 1.7790 * (U - 128), 0, 255).astype(np.uint8)
|
|
|
|
G = np.clip(Y - 0.3455 * (U - 128) - 0.7169 * (V - 128), 0, 255).astype(np.uint8)
|
|
|
|
R = np.clip(Y + 1.4075 * (V - 128), 0, 255).astype(np.uint8)
|
|
|
|
|
|
|
|
return B, G, R
|
|
|
|
|
|
|
|
|
|
|
|
def picture_show_yuv420(data, h, w): # type: (list[int], int, int) -> None
|
|
|
|
new_u = [0] * (h * w)
|
|
|
|
new_v = [0] * (h * w)
|
|
|
|
new_y = [0] * (h * w)
|
|
|
|
|
|
|
|
for i in range(int(h * w * 1.5)):
|
|
|
|
is_even_row = ((i // (w * 1.5)) % 2 == 0)
|
|
|
|
if is_even_row:
|
|
|
|
if (i % 3 == 0):
|
|
|
|
new_u[(i // 3) * 2] = data[i]
|
|
|
|
new_u[(i // 3) * 2 + 1] = data[i]
|
|
|
|
else:
|
|
|
|
if (i % 3 == 0):
|
|
|
|
new_u[(i // 3) * 2] = new_u[int((i - (w * 1.5)) // 3) * 2]
|
|
|
|
new_u[(i // 3) * 2 + 1] = new_u[int((i - (w * 1.5)) // 3) * 2 + 1]
|
|
|
|
|
|
|
|
for i in range(int(h * w * 1.5)):
|
|
|
|
if (i // (w * 1.5)) % 2 != 0 and (i % 3 == 0):
|
|
|
|
idx = (i // 3) * 2
|
|
|
|
new_v[idx] = data[i]
|
|
|
|
new_v[idx + 1] = data[i]
|
|
|
|
|
|
|
|
for i in range(int(h * w * 1.5)):
|
|
|
|
if (i // (w * 1.5)) % 2 == 0 and (i % 3 == 0):
|
|
|
|
idx = (i // 3) * 2
|
|
|
|
new_v[idx] = new_v[int((i + (w * 1.5)) // 3) * 2]
|
|
|
|
new_v[idx + 1] = new_v[int((i + (w * 1.5)) // 3) * 2 + 1]
|
|
|
|
|
|
|
|
new_y = [data[i] for i in range(int(h * w * 1.5)) if i % 3 != 0]
|
|
|
|
|
|
|
|
Y = np.array(new_y)
|
|
|
|
U = np.array(new_u)
|
|
|
|
V = np.array(new_v)
|
|
|
|
|
|
|
|
B, G, R = convert_YUV_to_RGB(Y, U, V)
|
|
|
|
# Merge channels
|
|
|
|
new_data = np.stack((B, G, R), axis=-1)
|
|
|
|
new_data = np.array(new_data).reshape(h, w, 3).astype(np.uint8)
|
|
|
|
|
|
|
|
# Display the image
|
|
|
|
cv.imshow('data', new_data)
|
|
|
|
cv.waitKey()
|
|
|
|
|
|
|
|
|
|
|
|
def picture_show_yuv422(data, h, w): # type: (list[int], int, int) -> None
|
|
|
|
# Reshape the input data to a 2D array
|
|
|
|
data_array = np.array(data).reshape(h, w * 2)
|
|
|
|
|
|
|
|
# Separate Y, U, and V channels
|
|
|
|
Y = data_array[:, 1::2]
|
|
|
|
U = data_array[:, 0::4].repeat(2, axis=1)
|
|
|
|
V = data_array[:, 2::4].repeat(2, axis=1)
|
|
|
|
|
|
|
|
# Convert YUV to RGB
|
|
|
|
B, G, R = convert_YUV_to_RGB(Y, U, V)
|
|
|
|
|
|
|
|
# Merge channels
|
|
|
|
new_data = np.stack((B, G, R), axis=-1)
|
|
|
|
|
|
|
|
# Display the image
|
|
|
|
cv.imshow('data', new_data)
|
|
|
|
cv.waitKey()
|
|
|
|
|
|
|
|
|
|
|
|
def picture_show_yuv444(data, h, w): # type: (list[int], int, int) -> None
|
|
|
|
# Reshape the input data to a 2D array
|
|
|
|
data_array = np.array(data).reshape(h, w * 3)
|
|
|
|
|
|
|
|
# Separate Y, U, and V channels
|
|
|
|
Y = data_array[:, 2::3]
|
|
|
|
U = data_array[:, 1::3]
|
|
|
|
V = data_array[:, 0::3]
|
|
|
|
|
|
|
|
# Convert YUV to RGB
|
|
|
|
B, G, R = convert_YUV_to_RGB(Y, U, V)
|
|
|
|
|
|
|
|
# Merge channels
|
|
|
|
new_data = np.stack((B, G, R), axis=-1)
|
|
|
|
|
|
|
|
# Display the image
|
|
|
|
cv.imshow('data', new_data)
|
|
|
|
cv.waitKey()
|
|
|
|
|
|
|
|
|
|
|
|
def main(): # type: () -> None
|
|
|
|
parser = argparse.ArgumentParser(description='which mode need to show')
|
|
|
|
|
|
|
|
parser.add_argument(
|
|
|
|
'--pic_path',
|
|
|
|
type=str,
|
|
|
|
help='What is the path of your picture',
|
|
|
|
required=True)
|
|
|
|
|
|
|
|
parser.add_argument(
|
|
|
|
'--pic_type',
|
|
|
|
type=str,
|
|
|
|
help='What type you want to show',
|
|
|
|
required=True,
|
|
|
|
choices=['rgb565', 'rgb888', 'gray', 'yuv422', 'yuv420', 'yuv444'])
|
|
|
|
|
|
|
|
parser.add_argument(
|
|
|
|
'--height',
|
|
|
|
type=int,
|
|
|
|
help='the picture height',
|
|
|
|
default=480)
|
|
|
|
|
|
|
|
parser.add_argument(
|
|
|
|
'--width',
|
|
|
|
type=int,
|
|
|
|
help='the picture width',
|
|
|
|
default=640)
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
height = args.height
|
|
|
|
width = args.width
|
|
|
|
|
2024-04-17 02:38:12 -04:00
|
|
|
data = open_picture(args.pic_path)
|
2024-04-17 02:37:04 -04:00
|
|
|
if (args.pic_type == 'rgb565'):
|
|
|
|
picture_show_rgb565(data, height, width)
|
|
|
|
elif (args.pic_type == 'rgb888'):
|
|
|
|
picture_show_rgb888(data, height, width)
|
|
|
|
elif (args.pic_type == 'gray'):
|
|
|
|
picture_show_gray(data, height, width)
|
|
|
|
elif (args.pic_type == 'yuv420'):
|
|
|
|
picture_show_yuv420(data, height, width)
|
|
|
|
elif (args.pic_type == 'yuv422'):
|
|
|
|
picture_show_yuv422(data, height, width)
|
|
|
|
elif (args.pic_type == 'yuv444'):
|
|
|
|
picture_show_yuv444(data, height, width)
|
|
|
|
else:
|
|
|
|
print('This type is not supported in this script!')
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|