D1 Code
import cv2
# 1 0 -1 3种不一样的模式
img = cv2.imread('assets/hello.png',-1)
print(type(img)) #查看img文件类型 numpy 图像使用numpy数组存储的
print(img.shape) #查看数组的大小 height width channels
img = cv2.resize(img,(0,0),fx=0.2,fy=0.2) #直接设置dsize像素值 或者 fx,fy 设置百分比
print(img.shape) #查看数组的大小 height width channels
tmp = img[300:600,0:432] #
img[000:300,0:432] = tmp
img = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imwrite('assets/new1.png',img)
# cv2.imshow('01',img) #窗口输出图像 01为窗口标签名称 ,img 为读取到的图像
cv2.imshow('02',img) #窗口输出图像 01为窗口标签名称 ,img 为读取到的图像
cv2.waitKey(5000) #多少秒后执行下一行 或者 单机任意键盘 #0# 值为无限长
cv2.destroyAllWindows() #关闭所有窗口
D2 Code
import cv2 #导入 opencv包
import numpy as np #导入 numpy 数组包
cnp = cv2.VideoCapture(0) #初始cnp 为video 0 #摄像头0
while True: #
ret, frame = cnp.read() # 读取摄像头的一帧
# width = int(cnp.get(cv2.CAP_PROP_FRAME_WIDTH)) #读取宽度 也可以使用 width = int(cnp.get(3)) #先是宽度后是高度
# height = int(cnp.get(cv2.CAP_PROP_FRAME_HEIGHT)) #读取高度 也可以使用 height = int(cnp.get(4)) #后是高度
width = int(cnp.get(3))
height = int(cnp.get(4))
print(width, height)
#如果要将一个大分成4个小的
image = np.zeros(frame.shape, np.uint8) # 创建一个和原来一样大的数组
temp_frame = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5) # 原来数组的长宽缩小二分之一
image[:height//2, :width//2] = cv2.rotate(temp_frame,cv2.ROTATE_180) #左上角旋转180度
image[height//2:, :width//2] = np.flip(temp_frame, axis = 1) #左下角水平翻转
image[:height//2, width//2:] = np.flip(cv2.rotate(temp_frame,cv2.ROTATE_180),axis=1) # 右上角水平翻转 旋转一百八十度
image[height//2:, width//2:] = temp_frame # 右下角
cv2.imshow('frame', image) #显示窗口
if cv2.waitKey(1) == ord('q'): # 输入q 退出 #cv2.waitKey(1) 之间要写1延时1ms 不加延时max
break
cnp.release() #释放cnp数组
cv2.destroyAllWindows() #关闭所有窗口
[Python]-numpy模块-反转数组的三种方法 - CAMILIA - 博客园 (cnblogs.com)
# numpy.flip() 函数,可以实现矩阵反转,沿轴的方向反转,一维不需要指定
reverse1 = np.flip(b, axis = 0) # 行内不变,列反转
reverse1 = np.flip(b, axis = 0) # 行内不变,列反转
reverse3 = np.flipud(b) # flipud()函数无axis参数,多维矩阵上的效果与flip(axis=0)相同
#numpy.flip() 函数,可以实现矩阵反转,沿轴的方向反转,一维不需要指定 ans3 = np.flip(a) print(ans3) # [5 4 3 2 1]
D3 Code
import cv2 #导入 opencv包
import numpy as np #导入 numpy 数组包
cnp = cv2.VideoCapture(0) #初始cnp 为video 0 #摄像头0
while True: #
ret, frame = cnp.read() # 读取摄像头的一帧
# width = int(cnp.get(cv2.CAP_PROP_FRAME_WIDTH)) #读取宽度 也可以使用 width = int(cnp.get(3)) #先是宽度后是高度
# height = int(cnp.get(cv2.CAP_PROP_FRAME_HEIGHT)) #读取高度 也可以使用 height = int(cnp.get(4)) #后是高度
width = int(cnp.get(3))
height = int(cnp.get(4))
print(width, height)
cv2.line(frame,(0,0),(width,height),(00,255,00),12) #显示一条线 (tu,开始,结束,颜色,线宽)
cv2.line(frame,(width,0),(0,height),(00,255,00),12)
cv2.rectangle(frame,(200,200),(300,300),(120,128,0),12) #画一个矩形
cv2.circle(frame,(320,240),50,(255,255,0),10) #画一个圆
font = cv2.FONT_ITALIC # 显示字体首先设置字体
cv2.putText(frame,'hello world',(200,200),font,2,(255,255,255),15,cv2.LINE_8) # 显示字体(xxx,显示的文字,显示开始位置,选择字体,字体大小,字体颜色,描边大小,字体显示样式)
cv2.imshow('frame',frame) #显示窗口
if cv2.waitKey(1) == ord('q'): # 输入q 退出 #cv2.waitKey(1) 之间要写1延时1ms 不加延时max
break
cnp.release() #释放cnp数组
cv2.destroyAllWindows() #关闭所有窗口
D4 Code
import cv2 #导入 opencv包
import numpy as np #导入 numpy 数组包
cnp = cv2.VideoCapture(0) #初始cnp 为video 0 #摄像头0
while True: #
ret, frame = cnp.read() # 读取摄像头的一帧
# width = int(cnp.get(cv2.CAP_PROP_FRAME_WIDTH)) #读取宽度 也可以使用 width = int(cnp.get(3)) #先是宽度后是高度
# height = int(cnp.get(cv2.CAP_PROP_FRAME_HEIGHT)) #读取高度 也可以使用 height = int(cnp.get(4)) #后是高度
width = int(cnp.get(3))
height = int(cnp.get(4))
print(width, height)
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) #将BGR转换为 hsv
lower_Red = np.array([10,100,10]) #最低值
upper_Red = np.array([255, 255, 255]) #最大值
mask = cv2.inRange(hsv,lower_Red,upper_Red) #创建一个蒙版显示 选中范围内的
rest = cv2.bitwise_and(frame,frame,mask=mask) # 只显示范围内范围值
cv2.imshow('frame',rest) #显示窗口
if cv2.waitKey(1) == ord('q'): # 输入q 退出 #cv2.waitKey(1) 之间要写1延时1ms 不加延时max
break
cnp.release() #释放cnp数组
cv2.destroyAllWindows() #关闭所有窗口
D5 Code
import numpy as np
import cv2
cnp = cv2.VideoCapture(0) #初始cnp 为video 0 #摄像头0
while True:
ret,frame = cnp.read()
width = cv2.CAP_PROP_FRAME_WIDTH
height = cv2.CAP_PROP_FRAME_HEIGHT
frame = cv2.resize(frame,(0,0),fx=1.5,fy=1.5)
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,90,0.01,200)
corners = np.int0(corners)
for corner in corners:
x,y = corner.ravel()
cv2.circle(frame,(x,y),10,(255,0,255),2)
cv2.imshow('frame',frame)
if cv2.waitKey(1) == ord('q'):
break
cnp.release()
cv2.destroyAllWindows()
D6 Code
# 导入必要的库
import numpy as np
import cv2
# 打开摄像头设备,这里使用的是摄像头0
cnp = cv2.VideoCapture(0)
# 创建一个无限循环,用于持续捕获和处理视频帧
while True:
# 从摄像头中读取一帧图像
ret, frame = cnp.read()
# 获取视频帧的宽度和高度
width = cv2.CAP_PROP_FRAME_WIDTH
height = cv2.CAP_PROP_FRAME_HEIGHT
# 将当前帧调整为1.5倍大小,以增强特征检测的准确性
frame = cv2.resize(frame, (0, 0), fx=1.5, fy=1.5)
# 将当前帧转换为灰度图像,因为边缘检测通常在灰度图像上进行
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用goodFeaturesToTrack函数检测图像中的角点,这些角点具有高对比度和稳定性
corners = cv2.goodFeaturesToTrack(gray, 20, 0.01, 200)
# 将检测到的角点转换为整数类型,并对其进行标记,以便在原始图像上绘制它们
corners = np.int0(corners)
# 遍历检测到的每个角点,并在原始图像上绘制一个圆来标记它,同时显示图像
for corner in corners:
x, y = corner.ravel()
cv2.circle(frame, (x, y), 10, (255, 0, 255), 2) # 用红色圆圈标记检测到的角点
cv2.imshow('frame', frame) # 显示当前帧的图像
# 如果按下'q'键,则退出循环,停止处理视频帧
if cv2.waitKey(1) == ord('q'): # 使用cv2.waitKey(1)函数等待用户输入,如果用户按下'q'键,则返回其ASCII码(即113)
break # 退出循环
# 释放摄像头设备,并关闭所有OpenCV窗口
cnp.release() # 释放摄像头设备资源
cv2.destroyAllWindows() # 关闭所有OpenCV窗口
cv2.goodFeaturesToTrack
函数用于检测图像中的角点。这些角点具有高对比度和稳定性,因此适合于跟踪或角点检测任务。
gray
:输入图像,必须是灰度图像。
20
:返回的最大角点数量。
0.01
:角点质量因子。它决定了角点应该有多“好”。值越小,返回的角点质量越高,但数量可能越少。
200
:用于比较角点质量的阈值。只有当角点的质量高于此阈值时,它才会被考虑为好的角点
# 导入必要的库
import numpy as np
import cv2
# 打开摄像头设备,这里使用的是摄像头0
cnp = cv2.VideoCapture(0)
# 创建一个无限循环,用于持续捕获和处理视频帧
while True:
# 从摄像头中读取一帧图像
ret, frame = cnp.read()
# 获取视频帧的宽度和高度
width = cv2.CAP_PROP_FRAME_WIDTH
height = cv2.CAP_PROP_FRAME_HEIGHT
# 将当前帧调整为1.5倍大小,以增强特征检测的准确性
frame = cv2.resize(frame, (0, 0), fx=1.5, fy=1.5)
# 将当前帧转换为灰度图像,因为边缘检测通常在灰度图像上进行
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用goodFeaturesToTrack函数检测图像中的角点,这些角点具有高对比度和稳定性
corners = cv2.goodFeaturesToTrack(gray, 20, 0.01, 200)
# 将检测到的角点转换为整数类型,并对其进行标记,以便在原始图像上绘制它们
corners = np.int0(corners)
# 遍历检测到的每个角点,并在原始图像上绘制一个圆来标记它,同时显示图像
for i in range(len(corners)):
for j in range(len(corners)):
corner1 = (corners[i][0])
corner2 = (corners[j][0])
# color = tuple(map(lambda x: int (x),np.random.randint(0,255,size = 3)))
color = (np.random.randint(0,255),np.random.randint(0,255),np.random.randint(0,255))
cv2.line(frame,corner1,corner2,color,1)
for corner in corners:
x, y = corner.ravel()
cv2.circle(frame, (x, y), 10, (255, 0, 255), 2) # 用红色圆圈标记检测到的角点
cv2.imshow('frame', frame) # 显示当前帧的图像
# 如果按下'q'键,则退出循环,停止处理视频帧
if cv2.waitKey(1) == ord('q'): # 使用cv2.waitKey(1)函数等待用户输入,如果用户按下'q'键,则返回其ASCII码(即113)
break # 退出循环
# 释放摄像头设备,并关闭所有OpenCV窗口
cnp.release() # 释放摄像头设备资源
cv2.destroyAllWindows() # 关闭所有OpenCV窗口
添加边界线版本
D7 Code 转换为灰度 边缘检测
利用OpenCV进行图像的轮廓检测_opencv轮廓检测-CSDN博客
import cv2
import numpy as np
frame = cv2.VideoCapture(0)
while True:
ret1,image = frame.read()
WB_frame = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(WB_frame,200,255,cv2.THRESH_BINARY)
cv2.imshow('binary',thresh)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()