图像识别-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()
相关推荐
jndingxin13 分钟前
OpenCV特征检测(1)检测图像中的线段的类LineSegmentDe()的使用
人工智能·opencv·计算机视觉
@月落23 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
z千鑫32 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
MinIO官方账号1 小时前
从 HDFS 迁移到 MinIO 企业对象存储
人工智能·分布式·postgresql·架构·开源
aWty_1 小时前
机器学习--K-Means
人工智能·机器学习·kmeans
草莓屁屁我不吃1 小时前
AI大语言模型的全面解读
人工智能·语言模型·自然语言处理·chatgpt
WPG大大通1 小时前
有奖直播 | onsemi IPM 助力汽车电气革命及电子化时代冷热管理
大数据·人工智能·汽车·方案·电气·大大通·研讨会
百锦再1 小时前
AI对汽车行业的冲击和比亚迪新能源汽车市场占比
人工智能·汽车
ws2019071 小时前
抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
大数据·人工智能·汽车
Zhangci]1 小时前
Opencv图像预处理(三)
人工智能·opencv·计算机视觉