Skip to content

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
Aidluxaidlux_2.x.x.x
支持语言接口Python3.10.12/ C++

限制

只能运行在开发环境所要求的运行条件下。

安装/卸载

可通过应用中心安装或卸载Smart Vision SDK。关于应用中心操作介绍,请参考相应文档。

也可以通过命令在线安装或卸载,例如:

bash
安装:
sudo aid-pkg install smartvision-sdk

卸载:
sudo aid-pkg remove smartvision-sdk

打开相机流程介绍

流程图

alt text

流程详细步骤介绍

  1. 首先调用打开摄像头API接口打开摄像头。
  2. 然后通过while循环并且调用获取图片数据API接口不断获取图片数据。
  3. 最后调用关闭流开关API接口关闭相机。

日志功能

SDK日志功能分为:

  • 打印日志,即控制台输出
  • 保存日志,即日志保存到文件
  • 动态设置日志等级,即可通过命令动态改变当前日志等级配置(影响文件输出)
  • 关闭日志,即关闭日志文件输出

动态修改日志级别

text
格式:
/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工具更多用法,请参考其帮助信息。

修改日志文件路径

text
格式:
/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工具更多用法,请参考其帮助信息。

查询日志级别配置

text
格式:
/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

日志保存于应用执行程序同一目录。例如:

text
$ 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.aidclog

C++示例代码

TIP

下列示例中的camera_idx参数说明:

  • camera_idx = 0:默认相机索引,即主设备相机0
  • camera_idx = 1:指定相机索引,即分设备相机1
  • camera_idx = 2:指定相机索引,即分设备相机2
cpp
#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启动摄像头。开启成功后可以看到相机启动成功的信息。

cpp
 if(start_camera(camera_idx) != 0)
    {
        CLOGI("Start camera failed.");
        return;
    }

然后使用while循环,通过调用get_cvimage,使用该函数时一定优先构建Image对象,并传入get_cvimage函数。 获取成功后可以看到相机获取数据成功信息。(例如:Camera 0 success!)

cpp
    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);

C++

std::atomic<bool> g_stop_signal{false};

void signal_handler(int signal)
{
    if (signal == SIGINT)
    {
        g_stop_signal = true;
    }
}

python示例代码

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启动摄像头。开启成功后可以看到相机启动成功信息。

python
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!)

python
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关闭摄像头。 完成后即可完成相机操作。