问题描述
本人最近想手搓一个透视变换的函数,这自然离不开对图像单一像素的操作,而在官方文档中也有着能修改单一像素的函数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