《OpenCV for Python》笔记

本文详细介绍了使用OpenCV for Python进行图像处理的各项操作,包括读取和保存图片、视频帧,颜色空间转换,图像二值化,以及在图像上绘画如画直线、矩形、圆等。还探讨了如何根据HSV颜色空间提取特定颜色,并展示了通过鼠标交互进行图像绘制的技巧。
摘要由CSDN通过智能技术生成

图像

使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,
或者给函数提供完整路径,图像的路径是错的, OpenCV 也不会提醒你的,但是当你print img时得到的结果是None

第二个参数是要告诉函数应该如何读取这幅图片。

  • cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,
    这是默认参数。
  • cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
  • cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道
import cv2
# 读图片文件
img = cv2.imread("D:/1/teacher.jpg",cv2.IMREAD_COLOR)

# 创建窗口,显示图片
cv2.imshow('windowName',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

保存图片,保存视频帧

# 保存图片
cv2.imwrite('D:/1/test.png',img) # 保存图片
cv2.imwrite('D:/1.jpg',frame) # 保存视频帧
print("保存成功")

按键来保存还是退出

import cv2

img = cv2.imread("D:/1/teacher.jpg",cv2.IMREAD_GRAYSCALE)

# 创建窗口,显示图片
cv2.imshow('windowName',img)
key = cv2.waitKey(0)
if key==27:   #如果按下esc键,退出
    cv2.destroyAllWindows()
elif key==ord('s'):  #如果按下s键,保存图片并退出
    cv2.imwrite('D:/1/test1.png',img)
    cv2.destroyAllWindows()

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

使用plt

import cv2
from matplotlib import  pyplot as plt

img = cv2.imread("D:/1/teacher.jpg",cv2.IMREAD_GRAYSCALE)
plt.imshow(img,cmap='gray',interpolation='bicubic')
plt.show()

获取和修改图片坐标点

import cv2
import numpy as np

img=cv2.imread('D:/1/teacher.jpg')

px = img[200,200] #获取坐标点的像素值
print(px)

img[200,200]=[255,255,255] # 修改坐标点的像素值

cv2.imshow('til',img)
cv2.waitKey(0)

图片转为灰度图,并且二值化

读取为灰度图

im = cv2.imread("D:/1/1.jpg",cv2.IMREAD_GRAYSCALE)

图片转为灰度图

im = cv2.imread("D:/1/1.jpg")

# 转为灰度图
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
cv2.imshow('灰度图',gray)
cv2.waitKey(0)

灰度图二值化

im = cv2.imread("D:/1/1.jpg")
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

# 二值化
thresh = 180  # 阈值
_, im = cv2.threshold(gray, thresh, 255, cv2.THRESH_BINARY)
cv2.imshow('二值化之后的图',im)
cv2.waitKey(0)

颜色空间转换

BRG图转为HSV图

H(色彩/色度)的取值范围是 [0, 179],
S(饱和度)的取值范围 [0, 255]
V(亮度)的取值范围 [0, 255]
在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色

im = cv2.imread("D:/1/1.jpg")
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)

BRG图与RGB图转换

imRGB = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
imBGR = cv2.cvtColor(im, cv2.COLOR_RGB2BGR)

根据HSV提取出某个颜色

在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色
颜色阈值: https://blog.csdn.net/chenghaoy/article/details/86509950

import cv2
import numpy as np

# 读取图片
im = cv2.imread("D:/1/4.png")

# 转换到 HSV
hsv = cv2.cvtColor(im,cv2.COLOR_BGR2HSV)

# 设定蓝色的阈值
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 根据阈值构建掩模
mask = cv2.inRange(hsv,lower_blue,upper_blue)
# 对原图像和掩模进行位运算,即可提取出蓝色图片,背景为黑色
res=cv2.bitwise_and(im,im,mask=mask)


cv2.imshow('im',im)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
cv2.waitKey(0)

视频

打开电脑相机拍摄


import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)  # 表示第几个摄像头

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('D:/1.avi',fourcc,20.0,(640,480)) # 视频保存路径

while cap.isOpened(): # 如果摄像头开着的话
    ret,frame = cap.read() # 返回的ret==true表示获取帧率成功
    if ret==True:
        # frame = cv2.flip(frame,0) # 旋转颠倒过来
        out.write(frame)

        cv2.imshow('标题:正在录制...按q退出并且保存到D:/1.avi',frame)
        if cv2.waitKey(1)&0xFF==ord('q'): # 按q退出
            break
    else:
        break

cap.release() # 释放视频
out.release()
cv2.destroyAllWindows()

读取视频文件

import cv2

# 读取视频文件
cap = cv2.VideoCapture("D:/1/test.mkv")

while True:
    # 不停的获取帧
    ret,frame = cap.read() # 返回的ret==true表示获取帧率成功
    if ret==True:
        # 显示图像
        title = '标题,press q quit, press p make screen shoot'
        cv2.imshow(title,frame)
        # 获取按键
        key = cv2.waitKey(1)&0xFF
        if key==ord('q'): # 按q退出
            break
        elif key==ord('p'): # 按p截图保存
            cv2.imwrite('D:/1.jpg',frame)
    else:
        break

cap.release() # 释放视频
cv2.destroyAllWindows()

在图片上绘画

基础:画直线,矩形,圆,椭圆,文字

画直线

import numpy as np
import cv2

# 创建黑色背景 长:1280 宽:720
img = np.zeros((720,1280),np.uint8)

point1=(0,0)
point2=(100,100)
color=(255,0,0) 
width=5 #线条粗细
cv2.line(img,point1,point2,color,width)

cv2.imshow('title',img)
# 获取按键,来阻塞线程,防止一闪而过
cv2.waitKey()

画矩形

cv2.rectangle(image, (5, 5), (100,100), (0, 255, 0), cv2.FILLED) # 实心矩形
cv2.rectangle(image, (5, 5), (100,100), (0, 255, 0), -1) # 实心矩形
cv2.rectangle(image, (200,200), (400,400),(0,255,0),5)

画圆

cv2.circle(img, point1, 5, color, -1) # 圆心和半径

画椭圆

cv2.ellipse(img,point1,(100,50),0,0,180,255,-1) # 圆心坐标,(长轴,短轴),开始角度,结束角度

绘制文字

point2=(100,100)  # 文字左下位置的坐标
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'english word不是中文',point2,font,4,color,2)
import numpy as np
import cv2

# 创建黑色背景 长:1280 宽:720
img = np.zeros((720,1280),np.uint8)

point2=(100,100)
color=(255,0,0)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'english word不是中文',point2,font,4,color,2) #绘制文字


winname = 'example'
cv2.namedWindow(winname) # 创建窗口
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

鼠标点击画圆

import cv2
import numpy as np
# 鼠标点击回调函数
def func(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDBLCLK: # 双击
        cv2.circle(img,(x,y),100,(255,0,0),-1)
    elif event==cv2.EVENT_LBUTTONDOWN: # 鼠标按下
        cv2.circle(img, (x, y), 100, (255, 0, 0), -1)

# 创建图像与窗口并将窗口
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
# 将窗口与回调函数绑定
cv2.setMouseCallback('image',func)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20)&0xFF==27: # 按esc退出
        break

cv2.destroyAllWindows()

鼠标拖动绘制实心矩形和曲线

import cv2
import numpy as np

# 当鼠标按下时变为 True
drawing=False

# 如果 mode 为 true 绘制矩形。按下'm' 变成绘制曲线。
mode=True
ix,iy=-1,-1

# 创建回调函数
def func(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:
                # 绘制圆圈,小圆点连在一起就成了曲线, 3 代表了笔画的粗细
                cv2.circle(img,(x,y),3,(0,0,255),-1)
                # 下面注释掉的代码是起始点为圆心,起点到终点为半径的
                # r=int(np.sqrt((x-ix)**2+(y-iy)**2))
                # cv2.circle(img,(x,y),r,(0,0,255),-1)

    # 当鼠标松开,就开始绘画
    elif event==cv2.EVENT_LBUTTONUP:
        drawing==False
        if mode==True: # 如果mode==true绘制矩形
            cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1) # 绘制小圆圈


img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',func)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)&0xFF
    if k==ord('m'):  # 按m切换模式,true表示画矩形,false表示画曲线
        mode=not mode
    elif k==27:  # 按esc退出
        break

鼠标绘制空心矩形

import cv2
import numpy as np

# 当鼠标按下时变为 True
drawing=False
ix,iy=-1,-1

# 创建回调函数
def func(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:
            cv2.line(img,(ix,iy),(ix,y),(0,255,0),3) # 画竖线
            cv2.line(img,(ix,iy),(x,iy),(0,255,0),3) # 画横线
    # 当鼠标松开,就开始绘画
    elif event==cv2.EVENT_LBUTTONUP:
        cv2.line(img,(x,iy),(x,y),(0,255,0),3) # 画竖线
        cv2.line(img,(ix,y),(x,y),(0,255,0),3) # 画横线



img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',func)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)&0xFF
    if k==ord('m'):  # 按m切换模式,true表示画矩形,false表示画曲线
        mode=not mode
    elif k==27:  # 按esc退出
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值