set_pixel函数无法正常对灰度图进行单像素的修改

Viewed 5

问题描述


本人最近想手搓一个透视变换的函数,这自然离不开对图像单一像素的操作,而在官方文档中也有着能修改单一像素的函数set_pixel()和读取单一像素的像素值的函数get_pixel()。按照官方文档的描述,修改灰度图像时使用set_pixel(x, y, value)便可将(x,y)坐标的像素的像素值设置成value,但我在实际使用中发现这根本无法实现对灰度图的修改,反而是用set_pixel(x, y, (value, value, value))这种对RGB图像进行像素值修改的方式才能正确实现对灰度图像的像素修改。假若在代码中大量使用set_pixel(x, y, (value, value, value))修改灰度图像的像素值图像帧率会直接暴跌至1、2帧,这显然无法实现我想要的对图像实时进行透视变换的功能。希望有人能为我解答这个问题,感谢!

复现步骤


这是问题代码

from media.media import *
from media.sensor import *
from media.display import *
import image
import os, sys, time


"""
功  能:根据显示方式自动初始化摄像头和显示屏
参  数:显示方式——VIRT、LCD、或HDMI,分别对应1920x1080、800x480、1920x1080的分辨率
       摄像头端口——0、1或2
返回值:”sensor“对象
"""
def Normal_init(Display_mode, sensor_id):
    #根据传入的Display_mode参数选择合适分辨率
    if Display_mode == "VIRT":
        image_width = ALIGN_UP(1920, 16)
        image_height = 1080
    elif Display_mode == "LCD":
        image_width = 800
        image_height = 480
    elif Display_mode == "HDMI":
        image_width = 1920
        image_height = 1080
    #根据传入的sensor_id定义相应端口的摄像头对象
    sensor = Sensor(id = sensor_id)
    sensor.reset()
    #摄像头(图像)水平、竖直翻转与否
    sensor.set_hmirror(False)
    sensor.set_vflip(False)
    #根据图像显示方式所确定的分辨率来初始化摄像头的分辨率
    sensor.set_framesize(width = image_width, height = image_height, chn = CAM_CHN_ID_0)
    sensor.set_pixformat(pix_format = Sensor.GRAYSCALE, chn = CAM_CHN_ID_0)
    #根据传入的Display_mode参数初始化显示器
    if Display_mode == "VIRT":
        Display.init(Display.VIRT, width = image_width , height = image_height)
    elif Display_mode == "LCD":
        Display.init(Display.ST7701, width = image_width, height = image_height, to_ide = True)
    elif Display_mode == "HDMI":
        Display.init(Display.LT9611, width = image_width, height = image_height, to_ide = True)
    #返回摄像头对象
    return sensor


try:
    #定义已经初始化的摄像头对象
    sensor = Normal_init("LCD", 2)
    clock = time.clock()
    #初始化媒体管理器(虽然不知道为什么,但这是必须的)
    MediaManager.init()
    #开启摄像头
    sensor.run()

    while True:
        clock.tick()
        os.exitpoint()
        #获取一帧图像,以便后续显示以及各种图像处理
        img = sensor.snapshot(chn = CAM_CHN_ID_0)
        """图像处理部分"""
        for y in range(480):
            for x in range(400, 420):
                img.set_pixel(x, y, 255)
        print(img.get_pixel(410, 410))
        #显示(处理后)图像,显示方式已在定义摄像头对象是以及初始化完成
        Display.show_image(img)
        print("fps:{}".format(clock.fps()))

except KeyboardInterrupt as e:
    print("用户停止", e)
except BaseException as e:
    print(f"异常:{e}")
finally:
    if isinstance(sensor, Sensor):
        #关闭摄像头
        sensor.stop()
    #关闭显示器
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    #关闭媒体管理器
    MediaManager.deinit()

硬件板卡


庐山派

软件版本


CanMV v1.2.2(based on Micropython e00a144) on 2024-12-18; k230_canmv_lckfb with K230

0 Answers