**
opencv常用函数总结(一)
**
opencv的使用首先需要import cv2,一般还要使用numpy,import numpy as np
opencv主要用于对于图像的处理,那么我们首先要学的就是导入图片
**
读取保存图像
**
这里我们需要学的函数是
cv2.imread(‘input_image’,0)
imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:
cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1
input_image是指图像的路径,0表示图片的读取方式
cv2.imshow()
cv2.imShow()函数可以在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。
第一个参数是一个窗口名称(也就是我们对话框的名称),它是一个字符串类型。第二个参数是我们的图像。您可以创建任意数量的窗口,但必须使用不同的窗口名称。
cv2.waitKey(0)
cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫 秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果 按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没 有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限 期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否 被按下,这个后面我们会接着讨论。
cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果 你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删 除的窗口名。
**
cv2.imwrite()
**
imwrite函数有两个参数,第一个参数是图片路径,第二个原来的图片
具体的使用如下:
import numpy as np
import cv2
img = cv2.imread('55.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
下面讲述物体追踪的基础,也就是标记相关的内容
利用opencv画图形,便于寻找到目标之后的标记
函数介绍如下:
**
cv2.line(img,(0,0),(511,511),(255,0,0),5)
**
参数 img表示定义的画板的大小,(0,0)表示起点的位置,(511,511)表示终点的位置,(255,0,0)表示线条的颜色,5表示线宽,如果是-1表示填充。
import numpy as np
import cv2
# Create a black image 定义框的大小
img=np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
#画直线
cv2.line(img,(0,0),(511,511),(255,0,0),5)
#画方形
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
#画圆 后边的3,5,表示线的粗细,-1表示填充
cv2.circle(img,(447,63), 63, (0,0,255), -1)
#画椭圆
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
#画多边形
pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
# pts=pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))
#放置文字
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2)
# winname='example'
# cv2.namedWindow(winname)
cv2.imshow('winname',img)
cv2.waitKey(0)
执行结果如下:
我们获取的图像大部分都是三通道的BGR图像,有时我们需要将这三个通道的像素分离开,那么提供如下两种方法:
一种是利用函数
**
#cv2.split()
**
其参数是img,也就是imread()读取的图像,其返回值是B,G,R,三个值,表示各个通道的像素值。
第二种是直接用数组的形式b=img[:,:,0],g=img[:,:,1],r=img[:,:,2],分别获取三个通道的像素。那么如何将这三个通道融合成一幅图片呢?有函数
**
cv2.merge([b,g,r])
**
import cv2
import numpy as np
img=cv2.imread('55.jpg')
# b=img[:,:,0]
print(img.shape)
b,g,r=cv2.split(img)
img=cv2.merge([b,g,r])
img1=cv2.merge([img[:,:,0],img[:,:,1],img[:,:,2]])
img1[:,:,2]=0
cv2.imshow('image',img)
cv2.imshow('image1',img1)
cv2.waitKey(0)
用鼠标当画笔
用鼠标当画笔首先就要捕捉鼠标事件,有函数
**
cv2.setMouseCallback(‘image’,draw_circle)
**
第一个参数是定义的窗口的大小,第二个参数是画图参数,即在鼠标双击的地方画圆。
event事件有[‘EVENT_FLAG_ALTKEY’, ‘EVENT_FLAG_CTRLKEY’, ‘EVENT_FLAG_LBUTTON’, ‘EVENT_FLAG_MBUTTON’, ‘EVENT_FLAG_RBUTTON’, ‘EVENT_FLAG_SHIFTKEY’, ‘EVENT_LBUTTONDBLCLK’, ‘EVENT_LBUTTONDOWN’, ‘EVENT_LBUTTONUP’, ‘EVENT_MBUTTONDBLCLK’, ‘EVENT_MBUTTONDOWN’, ‘EVENT_MBUTTONUP’, ‘EVENT_MOUSEHWHEEL’, ‘EVENT_MOUSEMOVE’, ‘EVENT_MOUSEWHEEL’, ‘EVENT_RBUTTONDBLCLK’, ‘EVENT_RBUTTONDOWN’, ‘EVENT_RBUTTONUP’]
本文使用的事件是鼠标左键双击画圆。
import cv2
import numpy as np
#mouse callback function
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
# 创建图像与窗口并将窗口与回调函数绑定
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)&0xFF==27:
# print(1)
break
cv2.destroyAllWindows()
图像填充
这里我们要学习的函数是
**
cv2.copyMakeBorder()
**
他有六个参数,第一个参数是imread()读取的图像,后面4个参数,分别是上下左右的填充边界尺寸,第六个参数是填充的类型有如下几种
cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcde-fgh|hgfedcb cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
– cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh41
– cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh|abcdefgh|abcdefg
import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE=[255,0,0]
img1=cv2.imread('55.jpg')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,20,20,20,20,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
不知道是什么效果的可以打印出来看看效果, 可以加深理解。
图像混合
这里要学习的函数是
**
cv2.addWeighted(img1,0.9,img2,0.1,0)
**
共有5个参数,分别为,图像一,图像一所占的权重,图像二,图像二所占的权重,最后一个是调节颜色用的,程序里面有解释。
import cv2
import numpy as np
img1=cv2.imread('66.png')
img2=cv2.imread('55.jpg')
dst=cv2.addWeighted(img1,0.9,img2,0.1,0)#后边的0是用来调节颜色的,可以为0-255
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()