Flutter中如何根据布尔值为图片指定区域上色?
实现方案(以Python + OpenCV为例)
核心逻辑
先确定胸部区域的掩码(mask),当chest=True时,将该区域与蓝色图层融合,完成染色。
具体步骤
- 加载并预处理图像
用OpenCV读取图像后,转换为RGB格式(OpenCV默认采用BGR编码):
import cv2 import numpy as np # 加载目标图像 img = cv2.imread("Iy80N.jpg") img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)- 加载并预处理图像
- 创建胸部区域掩码
针对固定图像,可手动框选胸部坐标生成掩码;如果需要适配不同图像,建议用人体姿态模型自动定位:
# 初始化全黑掩码 mask = np.zeros_like(img_rgb) # 根据你的图像调整胸部区域坐标(x1,y1为左上角,x2,y2为右下角) x1, y1, x2, y2 = 150, 300, 350, 500 # 将胸部区域标记为白色(表示需要染色的范围) mask[y1:y2, x1:x2] = [255, 255, 255]- 创建胸部区域掩码
- 根据布尔值执行染色
当chest=True时,融合蓝色图层与原始图像:
chest = True if chest: # 创建纯蓝色图层(RGB格式) blue_layer = np.full_like(img_rgb, (0, 0, 255)) # 仅在掩码区域替换为蓝色,其余保留原图 result = np.where(mask == 255, blue_layer, img_rgb) # 转换回BGR格式用于保存或显示 result_bgr = cv2.cvtColor(result, cv2.COLOR_RGB2BGR) cv2.imwrite("chest_colored.jpg", result_bgr) cv2.imshow("Result", result_bgr) cv2.waitKey(0) cv2.destroyAllWindows() else: # chest为False时直接展示原图 cv2.imshow("Original", img) cv2.waitKey(0) cv2.destroyAllWindows()- 根据布尔值执行染色
优化建议
- 手动坐标需根据图像实际调整,可用系统自带画图工具获取胸部区域的像素范围。
- 若需自动识别胸部,可使用MediaPipe Pose等人体姿态模型,通过定位胸部关键点生成不规则掩码。
- 想要半透明染色效果,可改用
cv2.addWeighted调整融合权重:alpha = 0.4 # 透明度,0为完全透明,1为完全不透明 blended = cv2.addWeighted(blue_layer, alpha, img_rgb, 1-alpha, 0) result = np.where(mask == 255, blended, img_rgb)
内容的提问来源于stack exchange,提问作者user21809094
相关产品推荐
相关产品推荐

