47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
|
|
import cv2
|
||
|
|
import os
|
||
|
|
|
||
|
|
def select_and_output_roi(img_path, save=True, save_dir="roi_output"):
|
||
|
|
img = cv2.imread(img_path)
|
||
|
|
if img is None:
|
||
|
|
raise RuntimeError("无法读取图片")
|
||
|
|
|
||
|
|
# OpenCV 自带 ROI 选择工具
|
||
|
|
roi = cv2.selectROI(
|
||
|
|
windowName="Select ROI (ENTER or C to confirm, ESC to quit)",
|
||
|
|
img=img,
|
||
|
|
showCrosshair=True,
|
||
|
|
fromCenter=False
|
||
|
|
)
|
||
|
|
|
||
|
|
cv2.destroyAllWindows()
|
||
|
|
|
||
|
|
x, y, w, h = roi
|
||
|
|
print(f"[INFO] ROI = (x={x}, y={y}, w={w}, h={h})")
|
||
|
|
|
||
|
|
roi_img = img[y:y+h, x:x+w]
|
||
|
|
|
||
|
|
if save:
|
||
|
|
os.makedirs(save_dir, exist_ok=True)
|
||
|
|
save_path = os.path.join(save_dir, "roi.png")
|
||
|
|
cv2.imwrite(save_path, roi_img)
|
||
|
|
print(f"[INFO] ROI 图像已保存: {save_path}")
|
||
|
|
|
||
|
|
return roi, roi_img
|
||
|
|
|
||
|
|
|
||
|
|
# ----------------------------
|
||
|
|
# main 测试
|
||
|
|
# ----------------------------
|
||
|
|
if __name__ == "__main__":
|
||
|
|
IMAGE_PATH = "test2.png" # 换成你的图片
|
||
|
|
|
||
|
|
roi, roi_img = select_and_output_roi(
|
||
|
|
IMAGE_PATH,
|
||
|
|
save=True
|
||
|
|
)
|
||
|
|
|
||
|
|
cv2.imshow("ROI Result", roi_img)
|
||
|
|
cv2.waitKey(0)
|
||
|
|
cv2.destroyAllWindows()
|