需求
需要批量对图片进行选区填充,目标检测的一个项目中,去掉部分区域,避免干扰
效果
函数
画点
def draw_points(event, x, y, flags, param): # 回调函数默认参数,无需修改
global points, img # 全局变量 要保持的点list,cv.imread读取的img
point_size = 10 # 点半径
point_color = (153, 51, 51) # 蓝色
thickness = 10 # 线条粗细
if event == cv.EVENT_LBUTTONDBLCLK:
# 左键双击,画出点,并保存到points中
cv.circle(img, (x, y), point_size, point_color, thickness)
points.append([x, y])
选区填充
def area_mask(img_path, area: np.ndarray, save_path, color=(0, 0, 0)):
”“”
area:np.array(points)
color: 填充的颜色
“”“
img = cv.imread(img_path)
img_filename = img_path.split("/")[-1]
cv.fillPoly(img, [area, ], color)
img_savepath = os.path.join(save_path, img_filename)
cv.imwrite(img_savepath, img)
代码
import glob
import os
import time
import cv2 as cv
import numpy as np
from tqdm import tqdm
def mkdir(path):
is_exits = os.path.exists(path)
if not is_exits:
os.makedirs(path)
def draw_points(event, x, y, flags, param):
global points, img
point_size = 10
point_color = (153, 51, 51) # 蓝色
thickness = 10
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), point_size, point_color, thickness)
points.append([x, y])
def area_mask(img_path, area: np.ndarray, save_path, color=(0, 0, 0)):
img = cv.imread(img_path)
img_filename = img_path.split("/")[-1]
cv.fillPoly(img, [area, ], color)
img_savepath = os.path.join(save_path, img_filename)
cv.imwrite(img_savepath, img)
def get_points(img_path):
global points, img
cv.startWindowThread()
cv.namedWindow('image', 0)
cv.resizeWindow("image", 640, 480)
cv.setMouseCallback('image', draw_points)
img = cv.imread(img_path)
while True:
cv.imshow("image", img)
k = cv.waitKey(1)
if k & 0xFF == 27:
break
cv.destroyAllWindows()
return np.array(points)
if __name__ == '__main__':
global img
points = []
images_path = "./data/images/*.jpg"
save_path = "./result/save"
mkdir(save_path)
image_path_list = glob.glob(images_path)
area = get_points(image_path_list[0])
for img_path in tqdm(image_path_list):
area_mask(img_path, area, save_path, color=(0, 0, 0))