chore.添加一个ROI小工具

This commit is contained in:
MistEO
2022-01-22 00:24:26 +08:00
parent 11805d9eca
commit 8c6e25a62d
3 changed files with 106 additions and 1 deletions

2
.gitignore vendored
View File

@@ -430,6 +430,6 @@ FodyWeavers.xsd
screen.png
adb_screen.png
tools/*.png
tools/**/*.png
resource/infrast
.vscode

104
tools/CropRoi/main.py Normal file
View File

@@ -0,0 +1,104 @@
# USAGE
# python click_and_crop.py
# 依次展示 ./src 目录下的文件,裁剪后保存到 ./dst 目录
import cv2
import os
# 初始化参考点列表和布尔值标志:是否正在执行裁剪
refPt = []
cropping = False
# 点击并裁剪ROI区域
# -events 鼠标事件(如按下鼠标左键,释放鼠标左键,鼠标移动等)
# -x x坐标
# -y y坐标
# -flages params 其他参数
def click_and_crop(event, x, y, flags, param):
# 获取全局变量的引用
global refPt, cropping
# 如果鼠标左被单击记录x,y坐标并显示裁剪正在进行
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
# 检测鼠标左键是否释放
elif event == cv2.EVENT_LBUTTONUP:
# 记录结束x,y坐标并显示裁剪结束
refPt.append((x, y))
cropping = False
draw = image.copy()
cv2.rectangle(draw, refPt[0], refPt[1], (0, 255, 0), 2)
cv2.imshow("image", draw)
std_width :int = 1280
std_height :int = 720
std_ratio = std_width / std_height
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
for filename in os.listdir("./src"):
if not filename.endswith(".png"):
continue
print(filename)
image = cv2.imread("./src/" + filename)
cur_ratio = image.shape[1] / image.shape[0]
if cur_ratio >= std_ratio: # 说明是宽屏或默认16:9按照高度计算缩放
dsize_width :int = (int)(cur_ratio * std_height)
dsize_height :int= std_height
else: # 否则可能是偏正方形的屏幕,按宽度计算
dsize_width :int = std_width
dsize_height :int = std_width / cur_ratio;
dsize = (dsize_width, dsize_height)
image = cv2.resize(image, dsize)
while True:
cv2.imshow("image", image)
key = cv2.waitKey(0) & 0xFF
if key == ord("s"):
break
elif key == ord("q"):
exit()
# 如果参考点列表里有俩个点,则裁剪区域并展示
if len(refPt) == 2:
left = refPt[0][0]
right = refPt[1][0]
top = refPt[0][1]
bottom = refPt[1][1]
roi = image[top:bottom, left:right]
horizontal_expansion = 100
vertical_expansion = 100
filename_x :int = (int)(left - horizontal_expansion / 2)
if filename_x < 0:
filename_x = 0
filename_y :int = (int)(top - vertical_expansion / 2)
if filename_y < 0:
filename_y = 0
filename_w :int = (right - left) + horizontal_expansion
if filename_x + filename_w > dsize_width:
filename_w = dsize_width - filename_x
filename_h : int = (bottom - top) + vertical_expansion
if filename_y + filename_h > dsize_height:
filename_h = dsize_height - filename_y
dst_filename :str = f'{filename}_{filename_x},{filename_y},{filename_w},{filename_h}.png'
print('dst:', dst_filename)
cv2.imwrite('./dst/' + dst_filename, roi)
refPt = []
cropping = False
# 关闭所有打开的窗口
cv2.destroyAllWindows()

View File

@@ -0,0 +1 @@
opencv-python~=4.5.3