背景
小编最近在接触处理图像的东西,因为研究生搞得是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)、本人业余时间可以承接毕业设计和各种小项目,如系统构建、成立网站、数据挖掘、机器学习、深度学习等。