跳到主要内容

AidCV SDK for Python

简介

在 AidLux 的 Web 桌面 中,由于其异于一般的图形用户界面( 如 AidLux 的 Wayland 桌面),OpenCV 中与 highgui 相关的功能会受到限制。具体来说,cv2.namedWindow 函数以及与其相关的 cv2.imshow,cv2.waitKey,cv2.setMouseCallback 等常用函数都无法正常工作。
为了给开发者在 AidLux Web 桌面 中提供一致性的开发体验,AidLux 提供了 AidCV。 AidCV 基于 OpenCV 构建,允许开发者在 AidLux 的 Web 桌面 中正常使用 imshow,waitKey 等常用函数,此外还提供了在 mipi 相机,AI 两个方面的扩展。
开发者可以如使用 OpenCV 一般使用 AidCV,仅当使用扩展功能时,才需要添加或修改代码,这也使得使用 OpenCV 的代码可以无缝运行在 AidLux 中。

版本

此文档基于 aidcv-sdk==1.0.4 撰写。

功能说明

AidCV SDK 为开发者提供以下扩展功能:
· 基于 web 的图形显示窗口,支持 点击事件按键事件
· 启用单个 mipi 相机。
· 常用的 AI 算法函数。

开发环境

AidCV 适用于大多数 AidLux 环境。

限制

由于 python 自身包管理器的限制,无法与其他版本的 OpenCV 同时安装。
注意: 在 aidcv-sdk>=1.0.4 后,该限制取消。

安装/卸载

可通过应用中心安装或卸载 AidCV。关于应用中心操作介绍,请参考相应文档。 也可以通过命令在线安装或卸载,例如:

安装:
sudo aid-pkg install aidcv-sdk

卸载:
sudo aid-pkg remove aidcv-sdk

导入

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

注意: 在 aidcv-sdk>=1.0.4 后,导入方式有所改变,这一变更可以很好地避免不同版本的 opencv 相互覆盖导致 aidcv 功能出现异常。

快速使用

这是一个涵盖了大多数 AidCV 扩展接口的例子

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

def my_mouse_callback(event, x, y, flags, params):
print(event, x, y, flags, params)

cv2.namedWindow("test", port = 9988)

cv2.setMouseCallback("test", my_mouse_callback, "test_params")

cap = cv2.VideoCapture("/dev/video2")
cap.set(3, 640)
cap.set(4, 480)

for i in range(1000):
ret, frame = cap.read()
if not ret:
continue
cv2.imshow("test", frame)

ret = cv2.waitKey(0)
cv2.destroyWindow("test")

API 详细说明

创建窗口 namedWindow

API namedWindow(winname, flags = 0, size = None, port = None) -> None
参数 参数名 类型 默认值 说明
winname str 无默认值 窗口绑定的窗口名,不可重复。
flags int 0 窗口属性,无效参数,是对 OpenCV 的兼容性遗留。
size 无限制 None 窗口尺寸,第一位为宽,第二位为高,形如 [width, height]。
port int None 使用的端口号,默认或传入不可使用的端口号时会使用随机端口。
返回值 None

使用指定端口 port 或随机端口构建一个 web 页面,同时在 Web 桌面 中创建一个窗口指向该页面。该 web 页面与 winname 绑定,基于该 winname,开发者可使用其他 api 影响这个 web 页面。当存在多个打开的 Web 桌面 时,每个 Web 桌面 均会弹出该窗口。

注意: 与 OpenCV 不同,在 Web 桌面 中创建的窗口无法自由调整其大小,如果开发者想控制窗口的大小使其与图像匹配,请在使用此 api 时显示传入 size 参数。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cv2.namedWindow("win0")

cv2.namedWindow("win1", cv2.WINDOW_AUTOSIZE)

cv2.namedWindow("win2", size = (640,480))

cv2.namedWindow("win3", cv2.WINDOW_AUTOSIZE, size = (640,480))

注册鼠标回调函数 setMouseCallback

API setMouseCallback(winname, onMouse, userdata = 0) -> None
参数 参数名 类型 默认值 说明
winname str 无默认值 目标窗口绑定的窗口名。
onMouse function 无默认值 回调函数,该函数将在鼠标点击目标窗口时被调用。回调函数需遵循该格式: call_back(event, x, y, flags, param)。其中 event 为触发的鼠标事件类型对应的常量,与 OpenCV 的定义一致。x,y 为鼠标的点击位置。flags为鼠标事件标志的常量,无效参数,是对 OpenCV 的兼容性遗留。param 为开发者传入的参数,即函数 setMouseCallback 的第三个参数。
userdata 无限制 0 传递给回调函数的可选参数,开发者自定义的外部数据。
返回值None

为指定的窗口设置鼠标回调函数,目前仅对鼠标的点击事件进行响应。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

import time

def call_back(event, x, y, flags, params):
print(event,x,y,params)

cv2.namedWindow("win")
cv2.setMouseCallback("win", call_back)
time.sleep(10)

等待按键事件 waitKey

API waitKey(delay = 0) -> int or str
参数 参数名 类型 默认值 说明
delay int 0 超时时间,单位为毫秒,其值小于或等于 0 时将永久等待按键事件。
返回值 int类型或str类型的常量,为捕获到按键的 ascii 码或按键名。

捕获键盘的下一次按键事件。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cv2.namedWindow("aa")
res = cv2.waitKey(10)
print(res)

显示图形 imshow

API imshow(winname, frame, port = None) -> None
参数 参数名 类型 默认值 说明
winname str 无默认值 目标窗口绑定的窗口名。若目标窗口不存在,则会自动调用namedWindow(winname, size = (frame.shape[1], frame.shape[0]), port = port) 创建窗口。
frame numpy.array 无默认值 待显示的图形数据,通常而言,传入 BGR 色彩的图形数据,以 RGB 色彩进行显示。
返回值 None

在目标窗口中显示指定的图形。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2
import time

frame = cv2.imread("test.jpg")

cv2.namedWindow("win0")

cv2.imshow("win0", frame)
cv2.imshow("win1", frame)

time.sleep(5)

销毁窗口 destroyWindow

API destroyWindow(winname) -> None
参数 参数名 类型 默认值 说明
winname str 无默认值 目标窗口绑定的窗口名。
返回值 None

销毁并关闭名称为 winname 的窗口。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2
import time

cv2.namedWindow("win0")
cv2.namedWindow("win1")

time.sleep(3)
cv2.destroyWindow("win0")
time.sleep(5)

销毁全部窗口 destroyAllWindows

API destroyAllWindows() -> None
参数
返回值 None

销毁并关闭当前进程开启的全部窗口。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2
import time

cv2.namedWindow("win0")
cv2.namedWindow("win1")

time.sleep(3)
cv2.destroyAllWindows()
time.sleep(5)

类 VideoCapture

VideoCapture 类用于从摄像头或视频文件中捕获视频帧,支持 usb 相机与 mipi 相机,由于底层限制,暂时不支持同时打开多个 mipi 相机。在不使用扩展参数的情况下,与 cv2.VideoCapture 一致,使用扩展参数初始化 VideoCapture 对象会重载为 AidCV 扩展的 VideoCapture。

初始化

VideoCapture 类有两种初始化方式。

初始化 VideoCapture()
参数
返回值 一个完成了初始化的 VideoCapture 实例。
初始化 VideoCapture(filename, apiPreference = 0, device = "usb")
参数 参数名 类型 默认值 说明
filename str 或 int 无默认值 视频文件名,usb相机节点名,或mipi相机 索引(0 为前置相机,1 为后置相机)。
apiPreference int 0 选择可用后端,无效参数,是对 OpenCV 的兼容性遗留。
device str "usb" 相机类型,可用值为 "usb", "mipi"。
返回值 一个完成了初始化同时打开指定设备或文件的 VideoCapture 实例。
使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture()

file_cap = cv2.VideoCapture("/home/aidlux/test.mp4")

usb_cap = cv2.VideoCapture("/dev/video2")

mipi_cap = cv2.VideoCapture(0, device = "mipi")

成员函数

成员函数 VideoCapture().open(filename, apiPreference = 0) -> None
参数 参数名 类型 默认值 说明
filename str 或 int 无默认值 视频文件名,usb相机节点名,或mipi相机 索引(0 为前置相机,1 为后置相机)。
apiPreference int 0 选择可用后端,无效参数,是对 OpenCV 的兼容性遗留。
返回值 None

打开相机或文件。

使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture()
cap.open("/dev/video2")

成员函数 VideoCapture().isOpened() -> bool
参数
返回值 bool类型的常量,表示当前相机是否已经成功打开。

打开对应设备或文件, 若 VideoCapture 实例已打开相机,该函数不会进行任何操作。

使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture("/dev/video2")

print(cap.isOpened())
成员函数 VideoCapture().read() -> (bool, numpy.array)
参数
返回值 (ret, frame)
ret: bool类型的常量,获取成功或失败。
frame: numpy数组,获取到的视频帧。

从已打开设备或文件中捕获图像帧。

使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture("/dev/video2")

ret, frame = cap.read()
if ret:
print(frame.shape)

成员函数 VideoCapture().get(propId) -> float
参数 参数名 类型 默认值 说明
propId int 无默认值 参数索引,最大值为18。索引对应参数与 OpenCV 保持一致。 由于底层实现问题,在 device="mipi" 时,目前仅 3: 宽,4: 高,5: 帧率有效。
返回值 常量,表示对应参数的值。

获取相机默认参数。

使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture("/dev/video2")
print(cap.get(3), cap.get(4))

成员函数 VideoCapture().set(propId, value) -> bool
参数 参数名 类型 默认值 说明
propId int 无默认值 参数索引,最大值为18。索引对应参数与 OpenCV 保持一致。由于底层实现问题,在 device="mipi" 时,目前仅 3: 宽,4: 高,5: 帧率有效。
value int 无默认值 对应参数待设置的值。
返回值 bool类型的常量,表示参数设置是否成功。bool类型的常量,表示参数设置是否成功。

设置相机指定参数, 待指定的参数与参数值需要在相机允许的范围内。

使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture("/dev/video2")
cap.set(3, 1920)
cap.set(4, 1080)
cap.set(5, 30)
ret, frame = cap.read()
print(frame.shape)

成员函数 VideoCapture().release()
参数
返回值 None

释放该 VidoCapture 实例打开的相机。

使用例
try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

cap = cv2.VideoCapture("/dev/video2")

cap.release()

数学计算 sigmoid

API sigmoid(x) -> numpy.array
参数 参数名 类型 默认值 说明
x numpy.array 无默认值 sigmoid 函数的自变量。
返回值 numpy.array类型的常量,与参数 x 的shape相同,为参数 x 经过 sigmoid 函数计算后的值。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

x = np.array(range(8)).reshape(2,2,2)
print(cv2.sigmoid(x))

数学计算 softmax

API softmax(x, axis = 0) -> numpy.array
参数 参数名 类型 默认值 说明
x numpy.array 无默认值 softmax 函数的自变量。
axis int 0 在指定的轴上进行计算。
返回值 numpy.array类型的常量,与参数 x 的shape相同,为参数 x 在指定轴 axis 上经过 softmax 函数计算后的值。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2

x = np.array(range(8)).reshape(2,2,2)
print(cv2.softmax(x, axis = 2))

生成彩色掩膜 colormask

API colormask(mask, color) -> list
参数 参数名 类型 默认值 说明
mask numpy.array 无默认值 二维或三维掩膜,二维掩膜应为 int 类型,三维掩膜应为 float 类型。
color list 无默认值 映射的颜色列表,每个颜色由 (r,g,b) 三维组成。
返回值 [color_mask] 或 [color_mask,...]
[color_mask]: 二维掩膜返回一张 彩色掩膜,标定各个位置属于哪一类。
[color_mask,...]: 三维掩膜返回一个 彩色掩膜组成的列表,分别标定各个位置是否属于该类。

使用 color 将二维或三维掩膜 mask 映射为彩色图像。映射过程遵循以下逻辑: 对于 二维掩膜,mask 各个位置的值的类型为 int, 即 0,1,2,...。不同的值被视为不同的类,不同的类映射为不同的颜色。 对于 三维掩膜,第三维 视为不同的类,前二维各个位置的值视为该位置属于某个类的概率,不同类映射为不同的颜色。

使用例

try: # aidcv-sdk>=1.0.4
import aidcv as cv2
except:
import cv2
import numpy as np

mask = np.array([[1, -1, 0], [2, 0, -2], [0, 3, -3]])[None]
colors = [(0,255,255)]
res = cv2.colormask(mask, colors)[0]
print(mask)
res = cv2.resize(res, (500,500), interpolation = cv2.INTER_NEAREST)
cv2.namedWindow("win0")
cv2.imshow("win0", res)
cv2.waitKey(3000)
print("next example")

mask = np.array([[1, 3, 0], [2, 0, 0], [0, 3, 0]])
colors = [(0,255,255),(255,0,0),(0,255,0),(0,0,255)]
res = cv2.colormask(mask, colors)[0]
print(mask)
res = cv2.resize(res, (500,500), interpolation = cv2.INTER_NEAREST)
cv2.imshow("win0", res)
cv2.waitKey(3000)
print("over")