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
| namedWindow(winname, flags = 0, size = None, port = None) -> None | |||
---|---|---|---|---|
| | | | |
| | | 窗口绑定的窗口名,不可重复。 | |
| | | 窗口属性,无效参数,是对 OpenCV 的兼容性遗留。 | |
| | | 窗口尺寸,第一位为宽,第二位为高,形如 [width, height]。 | |
| | | 使用的端口号,默认或传入不可使用的端口号时会使用随机端口。 | |
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
setMouseCallback(winname, onMouse, userdata = 0) -> None | ||||
---|---|---|---|---|
| | | | |
| | | 目标窗口绑定的窗口名。 | |
| | | 回调函数,该函数将在鼠标点击目标窗口时被调用。回调函数需遵循该格式: call_back(event, x, y, flags, param)。其中 event 为触发的鼠标事件类型对应的常量,与 OpenCV 的定义一致。x,y 为鼠标的点击位置。flags为鼠标事件标志的常量,无效参数,是对 OpenCV 的兼容性遗留。param 为开发者传入的参数,即函数 setMouseCallback 的第三个参数。 | |
| | | 传递给回调函数的可选参数,开发者自定义的外部数据。 | |
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
waitKey(delay = 0) -> int or str | ||||
---|---|---|---|---|
| | | | |
| | | 超时时间,单位为毫秒,其值小于或等于 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
imshow(winname, frame, port = None) -> None | ||||
---|---|---|---|---|
| | | | |
| | | 目标窗口绑定的窗口名。若目标窗口不存在,则会自动调用namedWindow(winname, size = (frame.shape[1], frame.shape[0]), port = port) 创建窗口。 | |
| | | 待显示的图形数据,通常而言,传入 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
destroyWindow(winname) -> None | ||||
---|---|---|---|---|
| | | | |
| | | 目标窗口绑定的窗口名。 | |
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
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") | |||
---|---|---|---|---|
| | | | |
| | | 视频文件名,usb相机节点名,或mipi相机 索引(0 为前置相机,1 为后置相机)。 | |
| | | 选择可用后端,无效参数,是对 OpenCV 的兼容性遗留。 | |
| | | 相机类型,可用值为 "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 | |||
---|---|---|---|---|
| | | | |
| | | 视频文件名,usb相机节点名,或mipi相机 索引(0 为前置相机,1 为后置相机)。 | |
| | | 选择可用后端,无效参数,是对 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 | |||
---|---|---|---|---|
| | | | |
| | | 参数索引,最大值为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 | |||
---|---|---|---|---|
| | | | |
| | | 参数索引,最大值为18。索引对应参数与 OpenCV 保持一致。由于底层实现问题,在 device="mipi" 时,目前仅 3: 宽,4: 高,5: 帧率有效。 | |
| | | 对应参数待设置的值。 | |
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
| sigmoid(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
| softmax(x, axis = 0) -> numpy.array | |||
---|---|---|---|---|
| | | | |
| | | softmax 函数的自变量。 | |
| | | 在指定的轴上进行计算。 | |
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
| colormask(mask, color) -> list | |||
---|---|---|---|---|
| | | | |
| | | 二维或三维掩膜,二维掩膜应为 int 类型,三维掩膜应为 float 类型。 | |
| | | 映射的颜色列表,每个颜色由 (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")