前言
经过一段时间的视频学习,现在开始正式转入书本知识的学习。使用的书本是这个:OpenCV-Python-Tutorial-中文版20160814
正文
Gui操作
图像的读取,写入
这部分简单,就直接都放在代码里面了。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#cv.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
#cv.IMREAD_GRAYSCALE:以灰度模式读入图像
#cv.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道
src = cv.imread("../images/lena.jpg",cv.IMREAD_COLOR)
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)# 图像灰度化
cv.imwrite("../images/gray.jpg",gray)
print(src.shape)
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)#cv2.WINDOW_NORMAL,你就可以调整窗口大小了
cv.imshow('input image', src)
k = cv.waitKey(0)&0xFF # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口
#,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。
print(k)
if k == 27:
cv.destroyAllWindows()#在括号内输入你想删除的窗口名。
else:
print("else is print")
cv.destroyAllWindows()#在括号内输入你想删除的窗口名。
matplotlib读取图片
对于彩色图片,一般由R,G,B三个通道构成。然而,需要注意的是,OpenCV里彩色图片加载时是按照BGR的顺序,Matplotlib里彩色图片加载时是按照RGB的顺序。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#第一部分
src = cv.imread("../images/lena.jpg",1)
plt.imshow(src)
plt.xticks([]),plt.yticks([])
plt.show()
#第二部分
b,g,r=cv.split(src) #通道的拆分
messi_rgb=cv.merge((r,g,b)) #通道的融合
plt.imshow(messi_rgb),plt.title('messi_rgb_plt')
plt.xticks([]),plt.yticks([])
plt.show()
第一部分的图像:
第二部分的图像:
注意:所有绘图函数的返回值都是返回none。
鼠標双击绘制圆
code
:
import cv2 as cv
import numpy as np
def draw_circle(event,x,y,drags,param):
if event ==cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),-1)
img = np.zeros((512,512,3),np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
key = cv.waitKey(1)
print(key)
if key==27:
break
cv.destroyAllWindows()
效果图
用鼠标绘制曲线或图形
用这个函数左键可以绘制曲线,按上m,能绘制出图形。
效果图
code
import cv2 as cv
import numpy as np
drawing = False
mode = True
ix,iy = -1,-1
def drawCircleRectangel(event,x,y,flags,param):
global ix,iy,drawing,mode
if event==cv.EVENT_LBUTTONDOWN:
#当按下左键时是返回起始坐标
drawing = True
ix,iy = x,y
#当鼠标左键按下并移动绘制图形,event可以查看移动,flag查看是否按下
elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_LBUTTON:
if drawing==True:
if mode==True:
cv.rectangle(src,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(src,(x,y),3,(0,0,255),-1)
elif event==cv.EVENT_LBUTTONUP:
drawing = False
src = np.zeros((512,512,3),np.uint8)
mode = False
cv.namedWindow('image',0)
cv.setMouseCallback('image',drawCircleRectangel)
while True:
cv.imshow('image',src)
k = cv.waitKey(1)&0xFF
if k==ord('m'):
mode=not mode
elif k==ord('q'):
break;
滑动条做调色板
cv2.creatTrackbar()有五个参数:
1:对象名字 2:对象所在面板的名字 3:Trackbar的默认值 4:Trackbar的上调范围(0-count) 5:是调节Trackbar的调用函数
cv2.getTrackbarPos() 同样有五个参数:
1:滑动条的名字 2:滑动条放置窗口的名字 3:滑动条默认位置 4:滑动条的最大值 5:回调函数(每次滑动条的滑动都会调用回到函数。回调函数通常都会有一个默认的参数,就是滑动条的位置。
效果图
code
import cv2 as cv
import numpy as np
def nothing(x):
pass
img = np.zeros((300,512,3),np.uint8)# 创建一个颜色图片
cv.namedWindow('image')
cv.createTrackbar('R','image',0,255,nothing)#创建一个Bar
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
switch="0:OFF\n1:ON"
cv.createTrackbar(switch,'image',0,1,nothing)
s = cv.getTrackbarPos(switch, 'image')
print("--->s:%s" % s)
while(1):
cv.imshow('image',img)
k=cv.waitKey(1)&0xFF
if k==27:
break;
r = cv.getTrackbarPos('R', 'image')
g = cv.getTrackbarPos('G', 'image')
b = cv.getTrackbarPos('B', 'image')
s = cv.getTrackbarPos(switch, 'image')
if s==0:
img[:] = 0
else:
img[:] = [b, g, r] # 把滚动条里的颜色赋给图