图像识别-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()
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬5 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114246 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠6 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好6 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力6 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo6 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_6 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能