OpenCV-python 学习笔记

图片

image_path="D:/4017b3a047be8128c90af6e96c936034.jpg" 设置图片路径

img=cv2.imread(image_path,0) 读入图片

                      

cv2.namedWindow('image', cv2.WINDOW_NORMAL) 创建窗口,名字是image

    你也可以先创建一个窗口, 之后再加载图像。这种情况下, 你可以决定窗口是否可以调整大小。使用到的函数是cv2.namedWindow()。初始设定函数标签是cv2.WINDOW_AUTOSIZE。但是如果你把标签改成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。

       

cv2.imshow('image',img) image窗口中现实img图片

                            

cv2.waitKey(0)  0键即可结束程序

cv2.imwrite('messigray.png',img) 首先需要一个文件名,之后才 是你要保存的图像。

警告:如果你用的是 64 位系统,你需要将  k = cv2.waitKey(0) 这行改成 k = cv2.waitKey(0)&0xFF。        

Matplotlib

import cv2

from matplotlib import pyplot as plt

image_path="D:/4017b3a047be8128c90af6e96c936034.jpg"

img = cv2.imread(image_path)

plt.imshow(img)  Matplotlib中读入图案

plt.xticks([]), plt.yticks([]) 关闭坐标刻度

          plt.axis('off') 关闭坐标轴

plt.show() Matplotlib中显示图案

视频

cap = cv2.VideoCapture(0)  参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap = cv2.VideoCapture(“../test.avi”)

while (True):

    ret, frame = cap.read() cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为Falseframe就是每一帧的图像。

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)

    if cv2.waitKey(1)& 0xFF == ord('q'): waitKey()方法本身表示等待键盘输入,参数是1,表示延时1ms切换到下一帧图像,对于视频而言;参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。

        break

cap.release() 调用release()释放摄像头

cv2.destroyAllWindows() 调用destroyAllWindows()关闭所有图像窗口。

注意:

1.cap.isOpened(),来检查是否成功初始化摄像头设备。如果返回值是 True,那就没有问题。否则就要使用函数 cap.open()。

2.cap.get(propId) 来获得视频的一些参数信息。这里 propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性。

3.cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。

ret=cap.set(3,320) 和 ret=cap.set(4,240) 来把宽和高改成 320X240。

import cv2

cap=cv2.VideoCapture("D:\[Nekomoekissaten][180293][È«¼¯][720p][x264_aac][chs][fin].mp4")

fourcc = cv2.VideoWriter_fourcc(*'XVID')

out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) # 创建视频流写入对象,VideoWriter_fourcc为视频编解码器,20为帧播放速率,(640480)为视频帧大小

while(cap.isOpened()):

    ret, frame = cap.read() #读取视频帧

    if ret==True:

        frame = cv2.flip(frame,0)   #flip()的作用是使图像进行翻转cv2.flip(filename, flipcode) filename:需要操作的图像flipcode:翻转方式

flipcode

1

水平翻转

0

垂直翻转

-1

水平垂直翻转

       

out.write(frame)#会将所有类型数据转换为字符,字符数组, 字符串并输出.

        cv2.imshow('frame',frame) #显示视频帧

        if cv2.waitKey(1) & 0xFF == ord('q'):

            break

    else:

        break

cap.release()

out.release()

cv2.destroyAllWindows()

#cv2.VideoWriter_fourcc('I', '4', '2', '0'),该参数是YUV编码类型,文件名后缀为.avi

#cv2.VideoWriter_fourcc('P', 'I', 'M', 'I'),该参数是MPEG-1编码类型,文件名后缀为.avi

#cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),该参数是MPEG-4编码类型,文件名后缀为.avi

#cv2.VideoWriter_fourcc('T', 'H', 'E', 'O'),该参数是Ogg Vorbis,文件名后缀为.ogv

#cv2.VideoWriter_fourcc('F', 'L', 'V', '1'),该参数是Flash视频,文件名后缀为.flv

OpenCV 中的绘图函数

import numpy as np
import cv2
img=np.zeros((512,512,3), np.uint8)#np.zeros()有两个参数,一个是创建的图片矩阵大小,另一个是数据类型512,512是像素(第一个512像素高,第二个是512像素宽)3BGR三种颜色uint8是用0-255表示所有颜色。
cv2.line(img,(0,0),(511,511),(255,0,0),5)#这个函数有5个参数,img是图像名称,起点坐标,终点坐标,(255,0,0)是蓝色,5是线的宽度会画一条 从左上方到右下角的蓝色线段。
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)#画矩形,左上角和右下角
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)#画椭圆,图像名称,中心点坐标,长轴长度,短轴长度,旋转角度,图像出现的部分(长轴顺时针方向起始的角度和结束角度)0,180是下半个椭圆,颜色数组这里255是蓝色,线宽
cv2.circle(img,(447,63), 63, (0,0,255), -1)#⚪,圆心、半径
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,[pts],True,(0,255,255),3)#图像名称,顶点列表(这个多边形在array中有四个顶点),True表示闭合,(0,255,255)是黄色,3是线宽
font=cv2.FONT_HERSHEY_SIMPLEX #字体
cv2.putText(img,‘OpenCV‘,(10,500), font, 4,(255,255,255),2)
#写字。图像名称,字符串,坐标,字体,字号,(255,255,255)白色、线宽2
cv2.imshow("img",img)
cv2.waitKey(0)

把鼠标当画笔

import cv2
import numpy as np

#定义画圆事件,如果事件双击左键发生

#则以此时双击的点为原点画一个半径为100px BGR(255,255,0)粗细为3px的圆圈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:
       
break
cv2.destroyAllWindows()

进阶

import cv2
import numpy as np
import time
img = cv2.imread(
'D:/4017b3a047be8128c90af6e96c936034.jpg')

 

# 当鼠标按下时变为True
drawing = False
# 如果mode true 绘制矩形。按下'm' 变成绘制曲线。
mode = True
ix, iy = -1, -1
# 创建回调函数
def draw_circle(event, x, y, flags, param):
   
global ix, iy, drawing, mode
   
# 当按下左键是返回起始位置坐标
   
if event == cv2.EVENT_LBUTTONDOWN:
        drawing =
True
       
ix, iy = x, y # 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下
       elif event == cv2.EVENT_MOUSEMOVE and flags== ==cv2.EVENT_FLAG_LBUTTON:
       
if drawing == True:
           
if mode == True:
                cv2.rectangle(img
, (ix, iy), (x, y), (0, 255, 0), -1)
           
else:
               
# 绘制圆圈,小圆点连在一起就成了线
               
cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
   
# 当鼠标松开停止绘画。
   
elif event == cv2.EVENT_LBUTTONUP:
        drawing =
False
cv2.namedWindow('image')
cv2.setMouseCallback(
'image', draw_circle)
while (1):
    cv2.imshow(
'image', img)
    k = cv2.waitKey(
1) & 0xFF
   
if k == ord('m'):
        mode =
not mode
   
elif k == ord('q'):
       
break

用滑动条做调色板

注意:cv2.waitKey(1)在有按键按下的时候返回按键的ASCII值,否则返回-1& 0xFF的按位与操作只取cv2.waitKey(1)返回值最后八位,因为有些系统cv2.waitKey(1)的返回值不止八位,ord(‘q’)表示qASCII

import cv2
import numpy as np
def nothing(x):
   
pass

 

# 创建一副黑色图像
img=np.zeros((300,512,3),np.uint8)
cv2.namedWindow(
'image')
cv2.createTrackbar(
'R','image',0,255,nothing)
cv2.createTrackbar(
'G','image',0,255,nothing)
cv2.createTrackbar(
'B','image',0,255,nothing)
switch=
'0:OFF\n1:ON'
cv2.createTrackbar(switch,'image',0,1,nothing)
while(1):
    cv2.imshow(
'image',img)
    k=cv2.waitKey(
1)

#&0xFF esc键的ASCII值是27,cv2.waitKey(10)& 0xFF==27就是当按下按键是esc的时候返回true。
    if k==27:
       
break
   
r=cv2.getTrackbarPos('R','image') #轨迹条的名字轨迹条依托窗口的名称                                    b=cv2.getTrackbarPos('B','image')
    s=cv2.getTrackbarPos(switch
,'image')
   
if s==0:
        img[:]=
0
   
else:
        img[:]=[b
,g,r]
cv2.destroyAllWindo

获取并修改像素值

import cv2


import numpy as np


img=cv2.imread("D:/4017b3a047be8128c90af6e96c936034.jpg")
blue=img[
50,50]# 是坐标(5050)处BGR三个通道分别的值

blue=umg[50,50]=[255,255,255]#修改BGR颜色

print img.item(10,10,2)

img.itemset((10,10,2),100)   ---进阶版
print (blue)

print (img.shape)   #img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数, 通道数的元组

print img.size #可以返回图像的像素数目

print img.dtype #返回的是图像的数据类型.

图像 ROI

import cv2
import numpy as np
img=cv2.imread(
'D:/4017b3a047be8128c90af6e96c936034.jpg')
ball=img[
280:340,330:390]#圈定此处的矩形方格内的图片
img[273:333,100:160]=ball#在图片的该处坐标内插入ball 存疑
cv2.imshow('hh',img)
cv2.waitKey(
0)

图像混合

img1=cv2.imread('D:/6d94e77269970ff7bcbdaa41db997211.jpeg')
img2=cv2.imread(
'D:/6d94e77269970ff7bcbdaa41db9972f1.jpeg')
dst=cv2.addWeighted(img1
,0.7,img2,0.3,0)

#把两幅图混合在一起。第一幅图的权重是 0.7,第二幅图的权重 是 0.3
cv2.imshow('dst',dst)
cv2.waitKey(
0)
cv2.destroyAllWindow()

你可能感兴趣的:(opencv,python)