使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,
或者给函数提供完整路径,图像的路径是错的, OpenCV 也不会提醒你的,但是当你print img时得到的结果是None
第二个参数是要告诉函数应该如何读取这幅图片。
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
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)
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)
imRGB = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
imBGR = cv2.cvtColor(im, cv2.COLOR_RGB2BGR)
在 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