Eason_ever 发表于 2024-12-31 14:04:06

行空板K10 microPython开机自启动与调用摄像头

尝试了官网的教程,unihiker.com.cn/wiki/k10/micropython_unihiker_k10 ,里面有很多好玩的玩法,但是不熟悉microPython的玩家可能一下子搞不定。
因此在这里记录下来:

1. 在Thonny中运行代码,需要点击run按钮。但是这是调试的时候的办法,而实际上,如果想要让系统通电之后直接运行这段代码,可以把代码放到“main.py”文件内。

保存代码就行。这样,代码会存在microPython的文件系统内。开机会优先运行这段代码。

但是也有一个问题,运行代码时,Thonny无法再次控制K10,可以重新在右下角这里选择一次,会中断代码运行,重新进入编程调试。

2. 想要写一个microPython的摄像头调用,其实代码很简单。
from unihiker_k10 import screen, camera
import time

screen.init(dir=2) # 代码中不调用时默认为2
camera.init() # 初始化摄像头
screen.show_camera(camera) # 将摄像头画面显示到屏幕上

while True:
    print(camera)
    time.sleep(0.1)但是里面camera到底是什么类型,其实并不清楚,要相对这个进行文件存储、传输,都还得仔细研究。先print看一下,是“Camera object”。


问问大模型,什么意思。

试试能不能行。

目前发现是有这些:
camera.init() # 初始化摄像头
print(dir(camera))
print(dir(camera.cam))
print(camera.capture())

['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'capture', 'init', 'cam']
['__class__', '__name__', 'DRAM', 'EFFECT_BLUE', 'EFFECT_BW', 'EFFECT_GREEN', 'EFFECT_NEG', 'EFFECT_NONE', 'EFFECT_RED', 'EFFECT_RETRO', 'FRAME_240X240', 'FRAME_96X96', 'FRAME_CIF', 'FRAME_FHD', 'FRAME_HD', 'FRAME_HQVGA', 'FRAME_HVGA', 'FRAME_P_3MP', 'FRAME_P_FHD', 'FRAME_P_HD', 'FRAME_QCIF', 'FRAME_QHD', 'FRAME_QQVGA', 'FRAME_QSXGA', 'FRAME_QVGA', 'FRAME_QXGA', 'FRAME_SVGA', 'FRAME_SXGA', 'FRAME_UXGA', 'FRAME_VGA', 'FRAME_WQXGA', 'FRAME_XGA', 'GRAYSCALE', 'JPEG', 'PSRAM', 'RGB565', 'WB_CLOUDY', 'WB_HOME', 'WB_NONE', 'WB_OFFICE', 'WB_SUNNY', 'XCLK_10MHz', 'XCLK_20MHz', 'YUV422', '__dict__', 'brightness', 'capture', 'contrast', 'deinit', 'flip', 'framesize', 'init', 'mirror', 'quality', 'saturation', 'speffect', 'whitebalance']b'\xff\xff\xff\xff\xff\看起来会一直输出拍摄的画面,一次一行,但是不会停止。暂时研究到这里,怎么获取一帧画面,还得再看下。

PY学习笔记 发表于 2025-1-1 17:27:33

运行camera.capture()后可以得到一帧的RGB565画面(一定要初始化后,还要import camera这是官方控制摄像头的库)

PY学习笔记 发表于 2025-1-1 17:51:44

import camera
from microbmp import MicroBMP #https://github.com/jacklinquan/micropython-microbmp/blob/main/microbmp.py

# 将 RGB565 转换为 RGB888 的函数
def RGB565_to_RGB888_array(rgb565_array, length, rgb888_array):
   for i in range(length):
       rgb565 = rgb565_array

       # 提取 RGB565 中的颜色分量
       red = (rgb565 >> 11) & 0x1F# 5 bits
       green = (rgb565 >> 5) & 0x3F# 6 bits
       blue = rgb565 & 0x1F# 5 bits

       # 将颜色分量扩展到 8 位
       r = (red << 3) | (red >> 2)# 5 bits to 8 bits
       g = (green << 2) | (green >> 4)# 6 bits to 8 bits
       b = (blue << 3) | (blue >> 2)# 5 bits to 8 bits

       # 将结果存储到 RGB888 数组
       rgb888_array = r
       rgb888_array = g
       rgb888_array = b

# 初始化摄像头
camera.init(0)

# 捕获一帧画面
buf = camera.capture()

# 创建 MicroBMP 实例
bmp = MicroBMP(width=640, height=480, depth=24)

# 将 RGB565 数据转换为 RGB888
rgb888_array = bytearray(bmp.DIB_w * bmp.DIB_h * 3)# 初始化 RGB888 格式的像素数据数组
RGB565_to_RGB888_array(buf, len(buf) // 2, rgb888_array)

# 将 RGB888 数据写入 MicroBMP 实例
for y in range(bmp.DIB_h):
   for x in range(bmp.DIB_w):
       idx = (y * bmp.DIB_w + x) * 3
       bmp = (rgb888_array, rgb888_array, rgb888_array)

# 保存 BMP 文件
bmp.save("image.bmp")

PY学习笔记 发表于 2025-1-1 17:54:01

你试一下这个代码

Eason_ever 发表于 2025-1-2 16:41:42

PY学习笔记 发表于 2025-1-1 17:51


谢谢大佬分享!赞!

Eason_ever 发表于 2025-1-6 15:21:17

PY学习笔记 发表于 2025-1-1 17:51


这段代码运行很棒,运行没有问题。但是写文件耗时还是比较大,转BMP也是耗时的(大约1分钟)。可以尝试在获得buf之后,通过其他方式传输。比如网络通信、串口通信。接下来,我会尝试把它写成串口通信,发到电脑上来转成图片。

PY学习笔记 发表于 2025-1-6 15:46:32

Eason_ever 发表于 2025-1-6 15:21
这段代码运行很棒,运行没有问题。但是写文件耗时还是比较大,转BMP也是耗时的(大约1分钟)。可以尝试在 ...

可以让摄像头的拍摄大小小一点
页: [1]
查看完整版本: 行空板K10 microPython开机自启动与调用摄像头