opencv根据坐标选取图片区域

背景

小编最近在接触处理图像的东西,因为研究生搞得是nlp,对于图像处理并不是太在行,但是,在研究生的时候,帮助过其他实验室的处理过部分图像问题,因此,知道还有一个叫opencv的东西,现在用起来,不可谓之不强大。接下来,我带领大家感受一下opencv的魅力所在。

需求

这个需求是这样的,需要通过计算机读取一张图片,然后,在图片上画出需要的图像轨迹,将这个图像抠下来进行后续处理。

过程

  • 首先,百度(惊不惊喜,意不意外);
  • 第二,我百度了一波之后,发现并没有我需要的功能,然后自己去啃了opencv;
  • 第三,把部分函数拿出来,试着调用一番,经调试成功。
    好了,以上就是怎么实现的功能,本篇文章就到这了(这样写肯定被一大群人骂)。

需要的函数

  • imread
    这个函数就比较好懂了,拆开就知道,image,read,读图像;

  • namedWindow
    这个函数也还可以,照样拆开,named,window,窗口命名;

  • imshow
    这个同样道理,图像展示;

  • destroyAllWindows
    这个同样,销毁所有窗口;

  • waitKey
    这个函数,是在imshow之后用,表示图像可以展示多长时间;

  • setMouseCallback
    这个函数才是重点,啥意思呢,响应鼠标操作,主要有三个参数组成,第一,本次操作的名称;第二,需要响应的函数;第三,参数;
    其中第二的响应的函数,里面包括众多的事件:
    Event:
    define CV_EVENT_MOUSEMOVE 0 //滑动
    define CV_EVENT_LBUTTONDOWN 1 //左键点击
    define CV_EVENT_RBUTTONDOWN 2 //右键点击
    define CV_EVENT_MBUTTONDOWN 3 //中键点击
    define CV_EVENT_LBUTTONUP 4 //左键放开
    define CV_EVENT_RBUTTONUP 5 //右键放开
    define CV_EVENT_MBUTTONUP 6 //中键放开
    define CV_EVENT_LBUTTONDBLCLK 7 //左键双击
    define CV_EVENT_RBUTTONDBLCLK 8 //右键双击
    define CV_EVENT_MBUTTONDBLCLK 9 //中键双击
    Flags:
    define CV_EVENT_FLAG_LBUTTON 1 //左鍵拖曳
    define CV_EVENT_FLAG_RBUTTON 2 //右鍵拖曳
    define CV_EVENT_FLAG_MBUTTON 4 //中鍵拖曳
    define CV_EVENT_FLAG_CTRLKEY 8 //(8~15)按Ctrl不放事件
    define CV_EVENT_FLAG_SHIFTKEY 16 //(16~31)按Shift不放事件
    define CV_EVENT_FLAG_ALTKEY 32 //(32~39)按Alt不放事件
    看到这些很头大吧,没关系,接下来,我们只讲功能,不讲函数。

代码走起

list1 = []
list2 = []


# 鼠标点击事件
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if flags == 1:
        if event == cv2.EVENT_MOUSEMOVE:
            # xy = "%d,%d" % (x, y)
            list1.append(x)
            list2.append(y)
            cv2.circle(param, (x, y), 1, (255, 0, 0), thickness=-1)
            # cv2.imshow('img', param)


# 获取坐标位置
def get_coor():
    img = cv2.imread('' + 'WX20201027-160735@2x.png')
    cv2.namedWindow("image")
    cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN, param=img)
    while 1:
        cv2.imshow("image", img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
get_coor()
up = sorted(list2)[0]
lower = sorted(list2)[-1]
left = sorted(list1)[0]
right = sorted(list1)[-1]

def select_pic(write_path, image, up, lower, left, right, i):
    image = cv2.imread(image)
    cv2.imwrite(write_path + '{}.jpg'.format(str(i)), image[up:lower, left:right])
select_pic('','WX20201027-160735@2x.png',up, lower, left, right,0)

刚开始图像:
在这里插入图片描述
中间处理图像(在原来图像上画出轮廓来,然后按字母q退出):
在这里插入图片描述
最终结果:
在这里插入图片描述
好了,以上就是整个内容了,有不懂或者需要交流的小伙伴们欢迎留言哦。
(1)、如果您在阅读博客时遇到问题或者不理解的地方,可以联系我,互相交流、互相进步;
(2)、本人业余时间可以承接毕业设计和各种小项目,如系统构建、成立网站、数据挖掘、机器学习、深度学习等。有需要的加QQ:1143948594,备注“csdn项目”

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值