Python+OpenCV:鼠标拖拽实现图像精准裁剪
🔥Python+OpenCV 实现鼠标拖拽裁剪图像!一键截取 + 自动保存,新手秒会
无需手动输坐标,鼠标拖拽画框就能裁!还能自动保存 + 输出精准像素坐标
在做图像处理、计算机视觉项目时,我们经常需要精准截取图像的指定区域。手动输入像素坐标既麻烦又容易出错,今天就用1 个 Python 脚本 + OpenCV,实现鼠标交互式图像裁剪:
✅ 鼠标拖拽画选框,实时绿色预览框
✅ 自动适配拖拽方向,正反拉框都能正常裁剪
✅ 松开鼠标一键生成裁剪图,自动保存到本地
✅ 控制台打印左上、右下精准坐标
✅ 纯代码实现,无需任何图像编辑工具
unsetunset一、效果先睹为快unsetunset
unsetunset二、环境准备unsetunset
只需要安装 OpenCV 库,一行命令搞定:
pip install opencv-python
unsetunset三、完整源码(直接复制运行)unsetunset
这是可直接使用的完整版代码,仅需修改图片路径即可运行:
import cv2# 全局变量:记录鼠标状态、坐标和图像start_x, start_y = -1, -1end_x, end_y = -1, -1drawing = Falseimg = Noneimg_copy = None# 鼠标回调函数:核心交互逻辑defmouse_cut(event, x, y, flags, param):global start_x, start_y, end_x, end_y, drawing, img, img_copy# 1. 鼠标左键按下:记录裁剪起点if event == cv2.EVENT_LBUTTONDOWN: drawing = True start_x, start_y = x, y# 2. 鼠标移动:实时绘制选框,预览裁剪区域elif event == cv2.EVENT_MOUSEMOVE:if drawing: temp_img = img_copy.copy()# 绘制绿色矩形框,线条粗细为2 cv2.rectangle(temp_img, (start_x, start_y), (x, y), (0, 255, 0), 2) cv2.imshow("原图-拖动选框", temp_img)# 3. 鼠标左键松开:完成裁剪、保存、输出坐标elif event == cv2.EVENT_LBUTTONUP: drawing = False end_x, end_y = x, y# 自动规范坐标(解决反向拖拽问题) x1 = min(start_x, end_x) y1 = min(start_y, end_y) x2 = max(start_x, end_x) y2 = max(start_y, end_y)# 核心:根据左上、右下坐标裁剪图像 crop_img = img[y1:y2, x1:x2]# 显示裁剪结果 cv2.imshow("裁剪结果", crop_img)# 自动保存裁剪后的图片到本地 cv2.imwrite("crop_img.png",crop_img)# 打印精准坐标 print(f"裁剪坐标:左上({x1},{y1}) 右下({x2},{y2})")if __name__ == "__main__":# ====================== 重要修改 ======================# 替换为你的图片路径(支持绝对路径/相对路径) img = cv2.imread("Shape.png")# ======================================================# 判断图片是否读取成功if img isNone: print("图片读取失败!请检查路径是否正确") exit()# 备份原图,防止绘制时覆盖原图 img_copy = img.copy()# 创建窗口 + 绑定鼠标交互事件 cv2.namedWindow("原图-拖动选框") cv2.setMouseCallback("原图-拖动选框", mouse_cut)# 显示原图 cv2.imshow("原图-拖动选框", img)# 按下任意键关闭所有窗口 cv2.waitKey(0) cv2.destroyAllWindows()
unsetunset四、3 步使用教程(小白专属)unsetunset
替换图片路径将代码中 Shape.png 改成你自己的图片路径(如 test.jpg、D:/image/photo.png)。
鼠标交互裁剪左键按住→拖拽画框→松开左键,自动生成裁剪图、保存文件、打印坐标。
裁剪坐标:左上(119,52) 右下(506,267)
unsetunset五、核心代码解析(一看就懂)unsetunset
1. 全局变量
用来存储鼠标起点 / 终点坐标、拖拽状态,同时备份原图,避免实时画框时损坏原图。
2. 鼠标回调函数(灵魂)
OpenCV 的鼠标交互核心,监听 3 个关键动作:
左键松开:自动修正坐标 → 裁剪图像 → 保存图片 → 输出坐标
3. 坐标自动规范
用 min()/max() 处理反向拖拽(从右下往左上拉框),保证裁剪永远有效。
4. 图像裁剪原理
OpenCV 图像本质是Numpy 数组,直接用数组切片 img[y1:y2, x1:x2] 完成裁剪,高效无损耗。
unsetunset六、自定义小技巧unsetunset
修改选框颜色代码中 (0,255,0) 是绿色,可替换为:
修改线条粗细把 cv2.rectangle 最后一个参数 2 改大 / 改小,调整框线粗细。
修改保存文件名把 crop_img.png 改成你想要的名称(如 result.jpg)。
unsetunset七、总结unsetunset
这个交互式裁剪工具,完美解决了手动输坐标裁剪的痛点: ✔ 适用于图像处理、目标标注、视觉项目开发 ✔ 代码轻量,可直接嵌入你的项目 ✔ 自动保存 + 输出坐标,复用性拉满
不管是日常办公截图,还是编程项目使用,都超级实用!赶紧收藏起来,需要的时候直接用~