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()
​
​