简介

看到个有趣的东西在用这个,之前也经常用这个来操作图片,但都是网上的代码,没好好看过文档,这次就好好看一下文档,记录一下自己觉得有意思的吧。(太深了也看不懂,简单过一下有个印象,图像处理类都可以问问GPT能不能用opencv实现

OpenCV-Python是基于Python的库,旨在解决计算机视觉问题。

安装

pip3 install opencv-python

验证安装:

>>> import cv2
>>> print(cv2.__version__)
4.8.0

说明

基础

import cv2

# 打开图片,最后表示彩色
img = cv2.imread('1.png', cv2.IMREAD_COLOR)

img变量其实是一个 numpy.ndarray 的 B,G,R 三个值的列表

显示图片和截图

import cv2

# 打开图片,最后表示彩色
img = cv2.imread('1.png', cv2.IMREAD_COLOR)

# 展示图片
cv2.imshow('lena', img)
# 等待3秒后关闭,设置为0会无限等待
cv2.waitKey(3000)

# 图像形状,彩色返回高、宽和通道数
print(img.shape)

# ROI截图
aa = img[0:524, 115:188]  # 前面是行(y),后面是列(x)
cv2.imshow('aa', aa)
cv2.waitKey(3000)

# 写入图片
cv2.imwrite("2.png", aa)

因为截图需要定位到坐标,一个一个试有点恼火,提供一个办法,点击图片返回坐标:

import cv2


# 鼠标点击事件的回调函数
def mouse_callback(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print("坐标 (x, y):", x, y)


# 加载图像
image = cv2.imread('1.png')

# 在图像上显示窗口
cv2.namedWindow('image')
cv2.setMouseCallback('image', mouse_callback)

while True:
    cv2.imshow('image', image)
    key = cv2.waitKey(1) & 0xFF

    # 按 'q' 键退出循环
    if key == ord('q'):
        break

cv2.destroyAllWindows()

视频

所有操作都可以和图片一样,只是记录一下如何使用视频(摄像头或者加载视频都可以

# 打开摄像头并灰度化显示
import cv2

# 初始化
capture = cv2.VideoCapture(0)  # 不知道为啥会连接到我的Iphone上

while capture.isOpened():
    # 设置
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
    capture.set(cv2.CAP_PROP_FPS, 30)
    # 获取一帧
    ret, frame = capture.read()
    # 将这帧转换为灰度图
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
capture.release()
cv2.destroyAllWindows()

颜色追踪

一般用HSV来追踪,所以我们需要先把图片转换为HSV的,然后再根据HSV颜色范围来

import cv2
import numpy as np

# 打开图片,最后表示彩色
img = cv2.imread('1.png', cv2.IMREAD_COLOR)

# 转换图片,一般用HSV来区分颜色
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 只显示红色的内容
lower_red = np.array([0, 70, 50])  # HSV中红色范围,可以用GPT辅助
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(img_hsv, lower_red, upper_red)
mark_red = cv2.bitwise_and(img, img, mask=mask)  # 用原来彩色图片显示

# 计算红色在整个图片中的占比
white_pixels = np.sum(mask == 255)  # 计算mask中白色像素数量
total_pixels = mask.shape[0] * mask.shape[1]  # 计算图片总像素数量
percentage = (white_pixels / total_pixels) * 100  # 计算占比
print("红色占比:{}%".format(percentage))

# 显示
cv2.imshow('mark_red', mark_red)
cv2.waitKey(3000)

# 写入图片
cv2.imwrite("2.png", mark_red)

关于HSV颜色范围,除了用GPT辅助,也可以手动来分析,代码如下:

red = np.uint8([[[0, 0, 255]]]) # 在BGR颜色空间中,这个表示红色
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print(hsv_red)  # [[[  0 255 255]]]

模板匹配

匹配一张图是不是在另一张图里面出现过,代码为 3.png 在 1.png 中出现的位置。

import cv2
import numpy as np

# 打开图片,最后表示彩色
img_big = cv2.imread('1.png', cv2.IMREAD_COLOR)
img_small = cv2.imread('3.png', cv2.IMREAD_COLOR)

# 匹配
res = cv2.matchTemplate(img_big, img_small, cv2.TM_CCOEFF_NORMED)
threshold = 0.9  # 阈值
loc = np.where(res >= threshold)  # 匹配程度大于%90 的坐标 y,x

# 循环所有坐标 画框
h, w = img_small.shape[:2]  # 获取匹配图的宽和高,方便画图
for pt in zip(*loc[::-1]):  # *号表示可选参数
    right_bottom = (pt[0] + w, pt[1] + h)
    cv2.rectangle(img_big, pt, right_bottom, (0, 255, 0), 1)  # PT表示左上角的坐标,right_bottom表示右下角的坐标,格式为 y,x


cv2.imshow("aa", img_big)
cv2.waitKey(3000)


# 写入图片
cv2.imwrite("2.png", img_big)

image-20240513下午125215977

Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2024-05-13 20:55:52

results matching ""

    No results matching ""