第16章 几种图像处理方式
第六章 几种图像处理方式
1. 直方图均衡化
其主要功能是增强图像的对比度,使图像的直方图分布更均匀。直方图是一种统计图表,用来显示图像中不同亮度值的分布情况。横轴表示亮度值(0-255),纵轴表示对应亮度值的像素数量。原图中,亮度可能分布不均,导致对比度不足或细节丢失。直方图均衡化通过调整像素亮度分布,让图像的亮度范围更均匀,增强对比度和细节。
image.histeq(adaptive=False, clip_limit=-1, mask=None)
对图像执行直方图均衡化,使图像的对比度和亮度标准化。 若 adaptive=True
,则启用自适应直方图均衡化方法,通常比非自适应方法效果更好,但处理速度较慢。 clip_limit
用于控制自适应直方图均衡化的对比度,较小的值(如 10)可以生成对比度受限的图像。 mask
是用于像素级操作的掩码图像,必须是黑白图像,且大小需与当前图像相同。仅掩码中白色像素对应的区域会被修改。 返回处理后的图像对象,允许后续调用其他方法。 不支持压缩图像和 Bayer 格式图像。
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.histeq()
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
2. 图像矫正
2.1 Gamma校正
Gamma 校正是为了调整图像的亮度和对比度而引入的非线性变换。简单来说,当 Gamma 值 >1 时,图像的中间灰度变亮,高亮区域对比度变强;当 Gamma 值 <1 时,图像的中间灰度变暗,整体对比会变弱。我们的人眼对亮度和颜色的感知并不是线性的,这个Gamma 校正可以根据人眼视觉特性来调整图像,看起来会更贴近我们想要的视觉效果。
src_img.gamma_corr(3)
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.gamma_corr(3)
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
2.2 旋转校正
src_img.rotation_corr(0.5)
在实际应用中,比如在检测条码、二维码或标志物时,一定角度的旋转会影响识别效果,我们就可以在预处理环节进行旋转校正。
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.rotation_corr(0.5)
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
2.3 镜头畸变校正
在摄像头拍摄过程中,由于镜头的光学特性,一些超广角镜头或低成本镜头常常会带来“桶形”或“枕形”等畸变,从而导致图像在边缘部分看起来被拉伸或压缩。通过镜头畸变校正函数,可以在一定程度上减小这种畸变带来的影响,让图像更为接近真实的效果。
src_img.lens_corr(3.0)
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.lens_corr(3.0)
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
3. 二值化
二值化是图像处理和计算机视觉中最基础、最常见的操作之一。它的目标是将彩色或灰度图像简化为仅有黑白两种像素的图像,便于后续提取轮廓、检测目标形状、做OCR文本识别等。比如在识别二维码、条码场景里面,二值化能极大地简化处理难度,降低处理器压力,提高识别速度。
最常见的二值化方法就是我们手动指定一个阈值,低于该阈值的像素变为黑,高于该阈值的像素变为白(或者反过来)。其他自定义阈值等属于高级的用法,这里暂不介绍。
src_img.binary([(120, 255)],invert=False) # 二值化,阈值范围为 (100, 255),不进行像素值反转
同时,本案例使用的图片格式为灰度格式,需要设置摄像头的输出像素格式为GRAYSCALE
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.GRAYSCALE, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.binary([(120, 255)], invert=False) # 二值化阈值(120,250)
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
4. 边缘检测
边缘检测是对图像进行高通滤波或微分运算,以突出像素值变化剧烈的区域,从而获取目标物体的边缘信息。通常是后续的形状分析、轮廓检测或特征提取的关键一步。在不需要识别颜色的场景下,往往先做灰度化,然后再做边缘检测。
image.find_edges(edge_type[, threshold])
该函数将图像转换为黑白图像,仅保留边缘为白色像素。
-
edge_type
可选值包括:image.EDGE_SIMPLE
- 简单的阈值高通滤波算法image.EDGE_CANNY
- Canny 边缘检测算法
-
threshold
是包含低阈值和高阈值的二元元组。您可以通过调整该值来控制边缘质量,默认设置为(100, 200)
。
注意: 此方法仅支持灰度图像。
4.1 Canny边缘检测算法
src_img.find_edges(image.EDGE_CANNY, threshold=(50, 80))
4.1.1 示例
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.GRAYSCALE, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.find_edges(image.EDGE_SIMPLE, threshold=(50, 255))
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
4.2 阈值高通滤波算法
src_img.find_edges(image.EDGE_SIMPLE, threshold=(50, 255))
4.2.1 示例
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.GRAYSCALE, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.find_edges(image.EDGE_SIMPLE, threshold=(50, 255))
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
4.3 拉普拉斯核
src_img.laplacian(2,mul=0.2) # 拉普拉斯边缘检测,窗口大小为 3
4.3.1 示例
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
sensor_id = 2
sensor = None
# 处理尺寸
picture_width = 400
picture_height = 240
DISPLAY_MODE = "LCD"
# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
# 虚拟显示器模式
DISPLAY_WIDTH = ALIGN_UP(1920, 16)
DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
# 3.1寸屏幕模式
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
# HDMI扩展板模式
DISPLAY_WIDTH = 1920
DISPLAY_HEIGHT = 1080
else:
raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")
try:
sensor = Sensor(id=sensor_id,width=1920, height=1080)
sensor.reset()
sensor.set_hmirror(False)
sensor.set_vflip(False)
sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
# 根据模式初始化显示器
if DISPLAY_MODE == "VIRT":
Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
elif DISPLAY_MODE == "LCD":
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
elif DISPLAY_MODE == "HDMI":
Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
MediaManager.init()
sensor.run()
fps = time.clock()
while True:
fps.tick()
os.exitpoint()
# 捕获通道0的图像
src_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 在屏幕左上角显示原始图像
Display.show_image(src_img,x=0,y=0,layer = Display.LAYER_OSD0)
# 图像处理
src_img.laplacian(2, mul=0.2)
# 在屏幕右上角显示处理后的图像
Display.show_image(src_img,x=DISPLAY_WIDTH-picture_width,y=0,layer = Display.LAYER_OSD1)
print(fps.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()
本文作者:hazy1k
本文链接:https://www.cnblogs.com/hazy1k/p/18724537
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步