OpenCV 的基本操作

图像输入输出模块 imgcodecs

读取图像文件

读取图片

1
cv2.imread(path[, flag])

第二个参数指定图片被读取的方式:

  • cv2.IMREAD_COLOR : 读入彩色图像,默认模式;
  • cv2.IMREAD_GRAYSCALE : 以灰度模式读入图像;
  • cv2.IMREAD_UNCHANGED : 加载图像包含alpha通道。

使用数字简约表示以上三种标记,分别为 10-1

1
2
3
import cv2
image_path = "images.jpg"
img = cv2.imread(image_path,0)

读取失败返回 None

读取照片的高度与宽度

1
2
3
4
5
6
7
8
9
10
11
import cv2 as cv
import numpy as np
img=cv.imread('pic.png')
print(np.shape(img))

height=np.shape(img)[0]
width=np.shape(img)[1]
channles=np.shape(img)[2]
print("height:",height)
print('width:',width)
print('channles:',channles)

保存照片

1
imwrite(filename,img[,params)->retval
1
2
3
4
5
6
7
8
9
10
import cv2 as cv
import numpy as np
img=cv.imread('pic.png')
height,width=img.shape[:2]
cv.line(img,(0,0),(width,height),(0,0,255),1)
cv.imwrite('output.jpg',img)
img=cv.imread('output.jpg')
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV 界面编程

新建窗口函数

1
namedWindow(winname[,flags])

flags

  • cv2.WINDOW_AUTOSIZE 窗口大小自动适应

  • cv2.WINDOW_NORMAL

1
2
3
4
5
6
7
import cv2 as cv
import numpy as np
img=cv.imread('pic.png')
cv.namedWindow('hemo',cv.WINDOW_NORMAL)
cv.imshow('hemo',img)
cv.waitKey(6000)
cv.destroyAllWindows()

单窗口显示多图片

利用 numpy 的 hstack 函数合并行数相同的矩阵数组

1
2
3
4
5
6
7
8
import cv2 as cv
import numpy as np
img1=cv.imread('pic.png')
img2=cv.imread('pic2.png')
img=np.hstack([img1,img2])
cv.imshow('a',img)
cv.waitKey(0)
cv.destroyAllWindows()

销毁窗口

  • cv2.destroyWindow(winname)

  • cv2.destroyAllWindows(winname)

  • cv2.resizeWindow(winname,width,height)

1
2
3
4
5
6
7
8
9
10
11
import cv2 as cv
import numpy as np
img1=cv.imread('pic.png')
img2=cv.imread('pic2.png')
img=np.hstack([img1,img2])
cv.namedWindow('1',cv.WINDOW_NORMAL)
cv.imshow('1',img)
cv.resizeWindow('1',900,300)
cv.waitKey(0)
cv.destroyAllWindows()
cv.destroyWindow()

鼠标事件

OpenCV 使用 setMousecallback 设定

1
2
3
4
//设置回调函数
def setMouseCallback(windowName, onMouse, param=None):
//回调函数
void your_mouse_callback(int event,int x,int y,int flags,void* param) ;

鼠标事件 event

enum
{
EVENT_MOUSEMOVE =0, //鼠标移动
EVENT_LBUTTONDOWN =1, //按下左键
EVENT_RBUTTONDOWN =2, //按下右键
EVENT_MBUTTONDOWN =3, //按下中键
EVENT_LBUTTONUP =4, //放开左键
EVENT_RBUTTONUP =5, //放开右键
EVENT_MBUTTONUP =6, //放开中键
EVENT_LBUTTONDBLCLK =7, //左键双击
EVENT_RBUTTONDBLCLK =8, //右键双击
EVENT_MBUTTONDBLCLK =9, //中键双击
EVENT_MOUSEWHEEL =10, //滚轮滚动
};

鼠标事件 flags

enum
{
CV_EVENT_FLAG_LBUTTON =1, //左键拖拽
CV_EVENT_FLAG_RBUTTON =2, //右键拖拽
CV_EVENT_FLAG_MBUTTON =4, //中键拖拽
CV_EVENT_FLAG_CTRLKEY =8, //按住 CTRL 拖拽
CV_EVENT_FLAG_SHIFTKEY =16, //按住 Shift 拖拽
CV_EVENT_FLAG_ALTKEY =32 //按住 ALT 拖拽
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2 as cv
import numpy as np
img=np.zeros((400,400))
def draw_circle(event,x,y,flags,param):
if event==cv.EVENT_LBUTTONDOWN:
cv.circle(img,(x,y),20,255,-1)
cv.namedWindow('1')
cv.setMouseCallback('1',draw_circle)
while(1):
cv.imshow('1',img)
n=cv.waitKey(5)
if n==ord('q'):
break
elif n==ord('s'):
cv.imwrite('output.jpg',img)
print('保存成功')
cv.destroyAllWindows()

滑动条事件

1
2
3
4
def createTrackbar(trackbarName, windowName, value, count, onChange):
def TrackbarCallback(pos,userdata)
def getTrackbarPos(trackbarname, winname):
def setTrackbarPos(trackbarname, winname, pos):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2 as cv
import cv2
import numpy as np
alpha=0.3
beta=80
img=cv2.imread('pic.png')
img2=cv.imread('pic.png')
def upadateAlpha(x):
global alpha,img,img2,beta
alpha=cv.getTrackbarPos('Alpha','1')
alpha=alpha*0.01
img=np.uint8(np.clip((alpha*img2+beta),0,255))
def updateBeta(x):
global alpha, img, img2,beta
beta=cv.getTrackbarPos('Beta','1')
img=np.uint8(np.clip((alpha*img2+beta),0,255))

cv.namedWindow('1')
cv.createTrackbar('Alpha','1',0,300,upadateAlpha)
cv.createTrackbar('Beta','1',0,255,updateBeta)
cv.setTrackbarPos('Alpha','1',100)
cv.setTrackbarPos('Beta','1',10)
while(1):
cv2.imshow('1',img)
if cv.waitKey(1)==ord('q'):
break
cv.destroyAllWindows()