当前位置:首页>python>【图像形状识别1】Python+OpenCV 实现鼠标拖拽裁剪图像!一键截取 + 自动保存,新手秒会

【图像形状识别1】Python+OpenCV 实现鼠标拖拽裁剪图像!一键截取 + 自动保存,新手秒会

  • 2026-10-11 07:34:49
【图像形状识别1】Python+OpenCV 实现鼠标拖拽裁剪图像!一键截取 + 自动保存,新手秒会

Python+OpenCV:鼠标拖拽实现图像精准裁剪

🔥Python+OpenCV 实现鼠标拖拽裁剪图像!一键截取 + 自动保存,新手秒会

无需手动输坐标,鼠标拖拽画框就能裁!还能自动保存 + 输出精准像素坐标

在做图像处理、计算机视觉项目时,我们经常需要精准截取图像的指定区域。手动输入像素坐标既麻烦又容易出错,今天就用1 个 Python 脚本 + OpenCV,实现鼠标交互式图像裁剪: 

✅ 鼠标拖拽画选框,实时绿色预览框 

✅ 自动适配拖拽方向,正反拉框都能正常裁剪 

✅ 松开鼠标一键生成裁剪图,自动保存到本地 

✅ 控制台打印左上、右下精准坐标 

✅ 纯代码实现,无需任何图像编辑工具


unsetunset一、效果先睹为快unsetunset

  1. 运行代码,弹出原图窗口

  2. 鼠标左键按住拖拽,画出绿色选框

  3. 松开左键,立刻弹出裁剪结果,本地自动保存图片

  4. 控制台输出裁剪区域的精准坐标,直接复用!


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

  1. 替换图片路径将代码中 Shape.png 改成你自己的图片路径(如 test.jpg、D:/image/photo.png)。

  2. 运行代码执行脚本,弹出原图窗口。

  3. 鼠标交互裁剪左键按住→拖拽画框→松开左键,自动生成裁剪图、保存文件、打印坐标。

    裁剪坐标:左上(119,52) 右下(506,267)


unsetunset五、核心代码解析(一看就懂)unsetunset

1. 全局变量

用来存储鼠标起点 / 终点坐标、拖拽状态,同时备份原图,避免实时画框时损坏原图。

2. 鼠标回调函数(灵魂)

OpenCV 的鼠标交互核心,监听 3 个关键动作:

  • 左键按下:记录裁剪区域的起点坐标

  • 鼠标移动:实时绘制绿色矩形,预览选区

  • 左键松开:自动修正坐标 → 裁剪图像 → 保存图片 → 输出坐标

3. 坐标自动规范

用 min()/max() 处理反向拖拽(从右下往左上拉框),保证裁剪永远有效。

4. 图像裁剪原理

OpenCV 图像本质是Numpy 数组,直接用数组切片 img[y1:y2, x1:x2] 完成裁剪,高效无损耗。


unsetunset六、自定义小技巧unsetunset

  1. 修改选框颜色代码中 (0,255,0) 是绿色,可替换为:

    • 红色:(0,0,255)

    • 蓝色:(255,0,0)

  2. 修改线条粗细把 cv2.rectangle 最后一个参数 2 改大 / 改小,调整框线粗细。

  3. 修改保存文件名把 crop_img.png 改成你想要的名称(如 result.jpg)。


unsetunset七、总结unsetunset

这个交互式裁剪工具,完美解决了手动输坐标裁剪的痛点: ✔ 适用于图像处理、目标标注、视觉项目开发 ✔ 代码轻量,可直接嵌入你的项目 ✔ 自动保存 + 输出坐标,复用性拉满

不管是日常办公截图,还是编程项目使用,都超级实用!赶紧收藏起来,需要的时候直接用~


最新文章

随机文章