SDK V2 简介
简介
功能说明
Smart Vision SDK V2 为开发者提供:
- 操作获取相机照片数据的API接口。所获相机照片数据用于后续人工智能模型推理。
- IO/TCP信号输出API接口。信号输出可发送NG/Alarm/Alarm Clear信号。
Smart Vision SDK V2 提供了C++和python两种类型的接口。开发者可以根据自身情况选择使用。
开发环境
Smart Vision SDK V2运行于Aidlux智能相机环境中。
| 类别 | 要求 |
|---|---|
| 操作系统 | Ubuntu22.04 |
| Aidlux | aidlux_2.x.x.x |
| 支持语言接口 | Python3.10.12/ C++ |
限制
只能运行在开发环境所要求的运行条件下。
安装/卸载
可通过应用中心安装或卸载Smart Vision SDK。关于应用中心操作介绍,请参考相应文档。
也可以通过命令在线安装或卸载,例如:
安装:
sudo aid-pkg install smartvision-sdk
卸载:
sudo aid-pkg remove smartvision-sdk打开相机流程介绍
流程图

流程详细步骤介绍
日志功能
SDK日志功能分为:
- 打印日志,即控制台输出
- 保存日志,即日志保存到文件
- 动态设置日志等级,即可通过命令动态改变当前日志等级配置(影响文件输出)
- 关闭日志,即关闭日志文件输出
动态修改日志级别
格式:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool <Command> <Module> <Key> <Value>
其中,Command为:set或者'-s'。
Module为smartvisionsdk_<pid>。
Key为log_level。
Value为:
off:关闭日志
err:打印错误日志
warn:打印警告日志
info:打印信息日志
例如:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool set smartvisionsdk_1234 log_level info
其中,查询当前引用smartvision sdk的执行程序的pid可通过以下命令:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool query smartvisionsdk camera_process_id
关于rtcm_tool工具更多用法,请参考其帮助信息。修改日志文件路径
格式:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool <Command> <Module> <Key> <Value>
其中,Command为:set或者'-s'。
Module为smartvisionsdk_<pid>。
Key为log_file_path。
Value为日志文件路径。如:/home/aidlux/,表示将在/home/aidlux路径下创建日志文件。(注:SDK初始日志默认存储在/tmp/smartvisionsdk/目录下)
例如:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool set smartvisionsdk_1234 log_file_path /home/aidlux/
日志文件路径默认值为应用程序所在路径。
其中,查询当前引用smartvision sdk的执行程序的pid可通过以下命令:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool query smartvisionsdk camera_process_id
关于rtcm_tool工具更多用法,请参考其帮助信息。查询日志级别配置
格式:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool <Command> <Module> <Key>
其中,Command为:query或者'-q'。
Module为smartvisionsdk_<pid>。
Key为log_level。
例如:
/opt/aidlux/cpf/aid-rtcm/tools/rtcm_tool query smartvisionsdk_1234 log_level日志保存于应用执行程序同一目录。例如:
$ ls -rlt
-rwxr-xr-x. 1 aidlux aidlux 127032 Jun 21 11:50 demo
-rw-r--r--. 1 aidlux aidlux 919473 Jun 21 13:34 aidclog_smartvisionsdk_logger_115125_429_2024-06-21.aidclogC++示例代码
TIP
下列示例中的camera_idx参数说明:
camera_idx = 0:默认相机索引,即主设备相机0。camera_idx = 1:指定相机索引,即分设备相机1。camera_idx = 2:指定相机索引,即分设备相机2。
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <nlohmann/json.hpp>
#include <chrono>
#include <ctime>
#include <vector>
#include <sys/mman.h>
#include "smart_vision.hpp"
#include "example.hpp"
#include "lmcsdk/license_manager_sdk.hpp"
#include "aidclog/aidclog.hpp"
#include "aidrtcm/aidrtcm.hpp"
#include "crow.h"
#include "crow/json.h"
using namespace std;
using namespace Aidlux::SmartVision;
std::atomic<bool> g_stop_signal{false}; //原子操作,用于控制程序退出
void signal_handler(int signal) //信号处理函数,用ctrl+c退出程序
{
if (signal == SIGINT)
{
g_stop_signal = true;
}
}
void camera_example(int camera_idx) //相机使用,用于获取图片数据
{
Image img; //Image结构体,用于存储图片数据
if(start_camera(camera_idx) != 0)
{
CLOGI("Start camera failed.");
return;
}
CLOGI(" Camera %d started successfully", camera_idx);
usleep(500 * 1000);
while (!g_stop_signal)
{
cv::Mat frame = Aidlux::SmartVision::get_cvimage(img, camera_idx, 1000);
printf("res=%dx%d | exp=%ld ns | iso=%ld\n",img.h, img.w,img.exposureTimeNs,img.isoValue);
if (frame.empty())
{
CLOGI ("Failed to get frame from camera %d",camera_idx);
usleep(10 * 1000);
continue;
}
// 此时 frame 是一个cv::Mat对象
// 可用于后续处理,例如:
// - 进行目标检测或识别
// - 分析图像内容
//
// 使用方式
// 示例:
// {
// std::lock_guard<std::mutex> lock(queue_mutex);
// processing_queue.push(frame.clone());
// }
//
/* ========== 自定义图像处理逻辑开始 ========== */
// std::queue<cv::Mat> frame_buffer;
// std::mutex queue_mutex;
// std::lock_guard<std::mutex> lock(queue_mutex);
// if (frame_buffer.size() < MAX_BUFFER_SIZE) {
// frame_buffer.push(frame.clone());
// }
/* ========== 自定义图像处理逻辑结束 ========== */
CLOGI("Camera %d frame processed successfully!", camera_idx);
// 控制采集/处理频率:
// - 使用 usleep() 可精确控制微秒级间隔
// - 或替换为 std::this_thread::sleep_for(...)
// 示例:std::this_thread::sleep_for(std::chrono::milliseconds(33)); // ≈30 FPS
//
// 注意:若自定义处理逻辑本身耗时较长,此处 sleep 时间应相应缩短,
// 否则会导致实际帧率低于预期。
usleep(/* 请根据目标帧率设置延迟,单位:微秒 */);
}
close_camera(camera_idx);
CLOGI("Camera %d stopped gracefully.", camera_idx);
}
int main(int argc, char * argv[])
{
signal(SIGINT, signal_handler); //注册使用crtl+c退出
int camera_idx = 0;
camera_example(camera_idx);
}C++示例代码精讲
必须优先调用start_camera启动摄像头。开启成功后可以看到相机启动成功的信息。
if(start_camera(camera_idx) != 0)
{
CLOGI("Start camera failed.");
return;
}然后使用while循环,通过调用get_cvimage,使用该函数时一定优先构建Image对象,并传入get_cvimage函数。 获取成功后可以看到相机获取数据成功信息。(例如:Camera 0 success!)
while (!g_stop_signal)
{
cv::Mat frame = Aidlux::SmartVision::get_cvimage(img, camera_idx, 1000);
printf("res=%dx%d | exp=%ld ns | iso=%ld\n",img.h, img.w,img.exposureTimeNs,img.isoValue);
if (frame.empty())
{
CLOGI ("Failed to get frame from camera %d",camera_idx);
usleep(10 * 1000);
continue;
}
/*自定义内容*/
CLOGI("Camera %d success!",camera_idx);
}最后,一定记得使用使用close_camera关闭摄像头。 完成后即可完成相机操作。
TIP
该实例中使用了原子变量g_stop_signal,用于控制程序退出。 退出时可以按下CTRL + C 来退出程序。 主函数中一定要注册signal(SIGINT, signal_handler);
std::atomic<bool> g_stop_signal{false};
void signal_handler(int signal)
{
if (signal == SIGINT)
{
g_stop_signal = true;
}
}python示例代码
import cv2
import time
import sys
import os
import signal
import threading
import numpy as np
import aidclog
import aidrtcm
import aidcvsdk
import aidcv
from pysmartvision import smartvisionsdk
g_stop_signal = False
Image img
def signal_handler(signal, frame):
global g_stop_signal
aidrtcm.rtcm_tool('-q', 'smartvisionsdk_%d' % os.getpid(), 'log_level', 'off')
aidrtcm.rtcm_tool('-q', 'smartvisionsdk_%d' % os.getpid(), 'log_file_path', '')
aidrtcm.rtcm_tool('-q', 'smartvisionsdk_%d' % os.getpid(), 'log_file_size', '0')
aidrtcm.rtcm_tool('-q', 'smartvisionsdk_%d' % os.getpid(), 'log_file_count', '0')
aidrtcm.rtcm_tool('-q', 'smartvisionsdk_%d' % os.getpid(), 'log_level', 'info')
g_stop_signal = True
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
camera_idx = 0
if smartvisionsdk.start_camera(camera_idx) != 0:
aidclog.log("Start camera failed.")
sys.exit(1)
aidclog.log("Camera %d started successfully" % camera_idx)
smartvisionsdk.start_camera_capture(camera_idx)
time.sleep(0.5)
while not g_stop_signal:
img = smartvisionsdk.get_cvimage(img,camera_idx, 1000)
if img is None:
aidclog.log("Failed to get frame from camera %d" % camera_idx)
time.sleep(0.01)
continue
aidclog.log("Camera %d success!" % camera_idx)
time.sleep(0.033) #模拟33ms的帧率
smartvisionsdk.close_camera(camera_idx)
aidclog.log("Camera %d stopped gracefully." % camera_idx)python示例代码精讲
必须优先调用start_camera启动摄像头。开启成功后可以看到相机启动成功信息。
if smartvisionsdk.start_camera(camera_idx) != 0:
aidclog.log("Start camera failed.")
sys.exit(1)
aidclog.log("Camera %d started successfully" % camera_idx)其次,调用start_camera_capture函数打开流开关。
然后使用while循环,通过调用get_cvimage,使用该函数时一定优先构建Image对象,并传入get_cvimage函数。 获取成功后可以看到相机获取数据成功信息。(例如:Camera 0 success!)
while not g_stop_signal:
image = smartvisionsdk.get_cvimage(img,camera_idx, 1000)
if image is None:
aidclog.log("Failed to get frame from camera %d" % camera_idx)
time.sleep(0.01)
continue
aidclog.log("Camera %d success!" % camera_idx)
time.sleep(0.033)最后,一定记得使用close_camera关闭摄像头。 完成后即可完成相机操作。