图像识别-opencv

cv.imread() --- 读取图像

1、0 或-1分别为加载 彩色、灰度、包括 alpha 通道图像

复制代码
img = cv.imread('messi5.jpg', 0)

cv.imshow() ---显示图像

第一个参数是窗口名,它是一个字符串,第二个参数就是我们的图像。

复制代码
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imwrite()-- 保存图像

复制代码
cv.imwrite('messigray.png',img)

在matplotlib里面显示

复制代码
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.show()

用相机捕捉直播,创建一个VideoCapture对象

复制代码
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
while(True):
    # 一帧一帧捕捉
    ret, frame = cap.read()
    # 我们对帧的操作在这里
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 显示返回的每帧
    cv.imshow('frame',gray)
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 当所有事完成,释放 VideoCapture 对象
cap.release()
cv.destroyAllWindows()

cv.line - 画线

复制代码
cv.line(img,(0,0),(511,511),(255,0,0),5)
# 线的开始,结束位置,颜色,宽度

cv.rectangle - 画矩形

复制代码
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

#左上角,右下角位置,颜色,线宽

cv.circle--画圆

复制代码
cv.circle(img,(447,63), 63, (0,0,255), -1)
# 圆心,半径,颜色,-1表示实心圆,1、2、3等数字就不会实心填充,代表线宽

cv.ellipse - 画椭圆

复制代码
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
# 圆心位置,(长轴长度,宽轴长度),逆时针旋转角度,起始角度,终止角度,椭圆颜色,填充(和圆一样)

画多边形--先创建顶点

复制代码
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) #顶点数及坐标
pts = pts.reshape((-1,1,2)) #组成一个形状为 ROWSx1x2 的数组
cv.polylines(img,[pts],True,(0,255,255))

添加文字 - cv.putText

复制代码
font = cv.FONT_HERSHEY_SIMPLEX
#指定使用的字体

cv.putText(img, 'OpenCV Drawing', (10, 500), font, 2, (255, 255, 255), 2, cv.LINE_AA)

#图像 img 上绘制文本 "OpenCV Drawing:要绘制的文本内容,文本的起始位置坐标,字体,字体缩放比例,文字颜色,文字的线宽,抗锯齿线类型

鼠标作为画笔

创建鼠标回调函数 --在图像的任何位置双击在上面画一个圆。

复制代码
import numpy as np
import cv2 as cv

# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    # 当鼠标左键双击事件发生时
    if event == cv.EVENT_LBUTTONDBLCLK:
        # 在双击位置绘制一个半径为100的蓝色实心圆
        cv.circle(img, (x, y), 100, (255, 0, 0), -1)

# 创建一个黑色图像,尺寸为512x512,具有3个颜色通道(RGB),数据类型为无符号8位整数
img = np.zeros((512, 512, 3), np.uint8)

# 创建一个名为'image'的窗口
cv.namedWindow('image')

# 将鼠标回调函数'draw_circle'绑定到窗口'image'
cv.setMouseCallback('image', draw_circle)

while(1):
    # 显示图像
    cv.imshow('image', img)
    # 等待20毫秒,检查是否按下了ESC键(键码为27)
    if cv.waitKey(20) & 0xFF == 27:
        # 如果按下ESC键,退出循环
        break

# 关闭所有OpenCV创建的窗口
cv.destroyAllWindows()

拖动鼠标绘制矩形或者圆

复制代码
import numpy as np
import cv2 as cv

# 初始化绘制状态
drawing = False  # 如果 True,则表示鼠标按下状态
mode = True      # 如果 True,则绘制矩形;按下 'm' 切换到绘制圆形
ix, iy = -1, -1  # 初始化起始点坐标

# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, mode
    
    if event == cv.EVENT_LBUTTONDOWN:
        # 鼠标左键按下时,开始绘制,并记录起始点坐标
        drawing = True
        ix, iy = x, y
    
    elif event == cv.EVENT_MOUSEMOVE:
        # 鼠标移动时,如果绘制状态为 True,则绘制形状
        if drawing:
            if mode:
                # 如果模式为 True,绘制矩形
                cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
            else:
                # 如果模式为 False,绘制圆形
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    
    elif event == cv.EVENT_LBUTTONUP:
        # 鼠标左键释放时,结束绘制
        drawing = False
        if mode:
            # 如果模式为 True,绘制矩形
            cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
        else:
            # 如果模式为 False,绘制圆形
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)

# 创建一个黑色图像,尺寸为512x512,具有3个颜色通道(RGB),数据类型为无符号8位整数
img = np.zeros((512, 512, 3), np.uint8)

# 创建一个名为'image'的窗口
cv.namedWindow('image')

# 将鼠标回调函数'draw_circle'绑定到窗口'image'
cv.setMouseCallback('image', draw_circle)

while(1):
    # 显示图像
    cv.imshow('image', img)
    
    # 等待20毫秒,检查是否按下了某个键
    key = cv.waitKey(20) & 0xFF
    
    if key == 27:
        # 如果按下ESC键,退出循环
        break
    elif key == ord('m'):
        # 如果按下'm'键,切换模式
        mode = not mode

# 关闭所有OpenCV创建的窗口
cv.destroyAllWindows()

设置一个调色板吧

复制代码
import numpy as np
import cv2 as cv

# 定义一个回调函数,用于轨迹栏的设置,但不执行任何操作
def nothing(x):
    pass

# 创建一个黑色图像,尺寸为300x512,具有3个颜色通道(RGB),数据类型为无符号8位整数
img = np.zeros((300, 512, 3), np.uint8)

# 创建一个名为'image'的窗口
cv.namedWindow('image')

# 创建三个轨迹栏,用于调整红色、绿色和蓝色的颜色值,初始值为0,最大值为255
cv.createTrackbar('R', 'image', 0, 255, nothing)  # 红色通道轨迹栏
cv.createTrackbar('G', 'image', 0, 255, nothing)  # 绿色通道轨迹栏
cv.createTrackbar('B', 'image', 0, 255, nothing)  # 蓝色通道轨迹栏

# 创建一个开关轨迹栏,用于启用和关闭颜色显示功能,初始值为0(OFF),最大值为1(ON)
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image', 0, 1, nothing)

# 无限循环以显示窗口和更新图像
while True:
    # 显示图像窗口
    cv.imshow('image', img)
    
    # 检测用户按键,按下ESC键(键码为27)时退出循环
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
    
    # 获取轨迹栏当前位置的值
    r = cv.getTrackbarPos('R', 'image')  # 获取红色通道的值
    g = cv.getTrackbarPos('G', 'image')  # 获取绿色通道的值
    b = cv.getTrackbarPos('B', 'image')  # 获取蓝色通道的值
    s = cv.getTrackbarPos(switch, 'image')  # 获取开关的值

    # 根据开关的状态更新图像
    if s == 0:
        # 如果开关为OFF(0),将图像设置为黑色
        img[:] = 0
    else:
        # 如果开关为ON(1),根据轨迹栏的值更新图像的颜色
        img[:] = [b, g, r]

# 关闭所有OpenCV创建的窗口
cv.destroyAllWindows()
相关推荐
好喜欢吃红柚子11 分钟前
【报错解决】RTX4090 nvrtc: error: invalid value for --gpu-architecture (-arch)
人工智能·python·深度学习·计算机视觉·visual studio
国际云,接待1 小时前
AWS S3:云存储的“超级基石”
服务器·网络·人工智能·github·aws·亚马逊
chilavert3181 小时前
深入剖析AI大模型:Prompt 优化的底层逻辑
人工智能·prompt
mwicogito1 小时前
实验复现:应用 RIR 触发器的 TrojanRoom 后门攻击实现
人工智能·python·机器学习·语音识别·后门攻击
CFAteam2 小时前
DeepSeek AI功能演示:如何生成Verilog脚本
人工智能·ai·fpga开发·llama
勤奋的知更鸟2 小时前
趣解TensorFlow之入门篇
人工智能·tensorflow·neo4j
꒰ঌ小武໒꒱2 小时前
DeepSeek 引领前端开发变革:AI 助力学习与工作新路径
人工智能·学习·ai编程
灏瀚星空3 小时前
高频交易技术:订单簿分析与低延迟架构——从Level 2数据挖掘到FPGA硬件加速的全链路解决方案
人工智能·python·算法·信息可视化·fpga开发·架构·数据挖掘
kdniao20253 小时前
快递接口调用选择:快递鸟、快递100、阿里云大对比
人工智能·阿里云·php
Hanson Huang3 小时前
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(2)——Prompt(提示词)
java·人工智能·spring·spring ai