Skip to content
On this page

视觉功能模块

初始化摄像头

初始化摄像头

lua
CameraInit(camera_id, capture_type, resolution)

功能:初始化并注册摄像头,开始采集画面

参数

  • camera_id:摄像头ID,从0开始
  • capture_type:采集卡类型(0=高速模式,1=兼容模式)
  • resolution:中心裁切分辨率

返回值:布尔值,表示初始化是否成功

示例

lua
local init_ok = CameraInit(0, 0, 320)
if init_ok then
    print("摄像头初始化成功")
else
    print("摄像头初始化失败")
end

获取最新摄像头帧

初始化摄像头

lua
CameraGetLatestFrame()

功能:获取摄像头最新一帧完整画面

返回值:RGB888原始图像数据,注意opencv调用请转一下格式!!!

示例

lua
local frame = CameraGetLatestFrame()
-- RGB888原始图像数据

获取最新正方形摄像头帧

获取最新正方形摄像头帧

lua
CameraGetLatestFrameSquare()

功能:获取摄像头最新一帧的正方形裁剪区域

返回值:RGB888原始图像数据,注意opencv调用请转一下格式!!!(尺寸取决于初始化时设置的分辨率)

示例

lua
local square_frame = CameraGetLatestFrameSquare()
-- 返回的是正方形区域,尺寸由CameraInit的第三个参数决定

查询摄像头数据

查询摄像头数据

lua
getCameraFormats(device_name)

功能:查询指定视频设备支持的格式、分辨率和帧率

参数

  • device_name:视频设备名称,如"video0"

返回值:支持的格式信息字符串

示例

lua
local formats = getCameraFormats("video0")
print(formats)

设置视频格式

设置视频格式

lua
setCameraFormat(device_name, width, height, format, fps)

注意:此方法必须在 初始化摄像头 前使用。

功能:设置指定视频设备的分辨率、编码格式和帧率

参数

  • device_name:视频设备名称,如"video0"
  • width:宽度分辨率
  • height:高度分辨率
  • format:视频编码格式,如"NV12"
  • fps:帧率

返回值:布尔值,表示设置是否成功

示例

lua
local ok = setCameraFormat("video0", 1920, 1080, "NV12", 60)
print("设置" .. (ok and "成功" or "失败"))

加载YoloV5模型

加载YoloV5模型

lua
YoloV5LoadModel(model_file, class_count)

功能:加载YoloV5神经网络模型

参数

  • model_file:模型文件名 可以加载rkdata和rknn模型
  • class_count:模型类别数量

返回值:整数,0表示成功,非0表示失败

注意:截图大小在推理内部始终和模型的尺寸是一致的,如果模型尺寸是320,输入的图片尺寸就是320,如果设置的截图范围小于320就放大到320,会导致识别范围较小或者是放大后失真识别不到目标。如果输入图片尺寸是640,在推理内部就会将图片缩放到模型大小为320,这样会导致损失很小的细节导致小目标无法被识别,优点是可以有更广的识别范围

示例

lua
local ret = YoloV5LoadModel("yolov5s.rknn", 2)
if ret == 0 then
    print("模型加载成功")
else
    print("模型加载失败")
end

加载YoloV8模型

加载YoloV8模型

lua
YoloV8LoadModel(model_file, class_count)

功能:加载YoloV8神经网络模型

参数

  • model_file:模型文件名 可以加载rkdata和rknn模型
  • class_count:模型类别数量

返回值:整数,0表示成功,非0表示失败

注意:截图大小在推理内部始终和模型的尺寸是一致的,如果模型尺寸是320,输入的图片尺寸就是320,如果设置的截图范围小于320就放大到320,会导致识别范围较小或者是放大后失真识别不到目标。如果输入图片尺寸是640,在推理内部就会将图片缩放到模型大小为320,这样会导致损失很小的细节导致小目标无法被识别,优点是可以有更广的识别范围

示例

lua
local ret = YoloV8LoadModel("yolov8s.rknn", 2)
if ret == 0 then
    print("模型加载成功")
else
    print("模型加载失败")
end

YoloV5目标检测

目标检测

lua
YoloV5DetectImg(image, nms_threshold, confidence_threshold, max_detections)

功能:使用YoloV5模型对图像进行目标检测

参数

  • image:输入图像(RGB888原始图像数据),opencv mat图像得通过专用函数转一下才能用
  • nms_threshold:NMS阈值,用于抑制重叠框
  • confidence_threshold:置信度阈值
  • max_detections:最大检测数量

返回值:检测到的目标数组,每个目标包含属性:

  • cls_id:目标类别ID
  • prop:目标置信度
  • box_x:框左上角X坐标
  • box_y:框左上角Y坐标
  • box_w:框宽度
  • box_h:框高度

示例

lua
local results = YoloV5DetectImg(frame, 0.45, 0.25, 100)
if results and #results > 0 then
    for i, det in ipairs(results) do
        print(string.format("目标%d: 类别=%d 置信度=%.2f 位置=(%d,%d,%d,%d)",
            i, det.cls_id, det.prop, det.box_x, det.box_y, det.box_w, det.box_h))
    end
else
    print("未检测到目标")
end

YoloV8目标检测

目标检测

lua
YoloV8DetectImg(image, nms_threshold, confidence_threshold, max_detections)

功能:使用YoloV8模型对图像进行目标检测

参数

  • image:输入图像(RGB888原始图像数据),opencv mat图像得通过专用函数转一下才能用
  • nms_threshold:NMS阈值,用于抑制重叠框
  • confidence_threshold:置信度阈值
  • max_detections:最大检测数量

返回值:检测到的目标数组,每个目标包含属性:

  • cls_id:目标类别ID
  • prop:目标置信度
  • box_x:框左上角X坐标
  • box_y:框左上角Y坐标
  • box_w:框宽度
  • box_h:框高度

示例

lua
local results = YoloV8DetectImg(frame, 0.45, 0.25, 100)
if results and #results > 0 then
    for i, det in ipairs(results) do
        print(string.format("目标%d: 类别=%d 置信度=%.2f 位置=(%d,%d,%d,%d)",
            i, det.cls_id, det.prop, det.box_x, det.box_y, det.box_w, det.box_h))
    end
else
    print("未检测到目标")
end

初始化网页预览服务

初始化网页预览服务

lua
StartMJPEGServer(port)

功能:启动MJPEG流服务器用于网页预览

参数

  • port:服务器端口(可空,默认5656,无特殊要求请勿修改)

示例

lua
StartMJPEGServer(5656)
print("预览服务已启动在端口5656")

推送图片到预览窗口

推送图片到预览窗口

lua
StreamPushFrame(frame)

功能:将图像推送到网页预览窗口

参数

  • frame:图像数据(RGB888原始图像数据),opencv mat图像得通过专用函数转一下才能用

示例

lua
local frame = CameraGetLatestFrame()
StreamPushFrame(frame)

标准模板匹配

标准模板匹配

lua
templateMatchingStandard(bigImg, smallImg, x1, y1, x2, y2, sim, multiTarget)

功能:在大图中搜索与模板图匹配的目标区域

参数

  • bigImg:大图RGB888对象(待搜索的图像)
  • smallImg:模板图RGB888对象(用于匹配的模板)
  • x1:搜索区域左上角X坐标(0表示从图像左边界开始)
  • y1:搜索区域左上角Y坐标(0表示从图像上边界开始)
  • x2:搜索区域右下角X坐标(0表示到图像右边界)
  • y2:搜索区域右下角Y坐标(0表示到图像下边界)
  • sim:相似度阈值(0.0-1.0之间的浮点数)
  • multiTarget:是否进行多目标匹配(true/false)

返回值

  • status:状态码
    • 1:匹配成功
    • 0:未找到匹配目标
    • -2:输入参数错误
    • -100:坐标无效
  • results:匹配结果数组,每个结果包含属性:
    • x:匹配区域左上角X坐标
    • y:匹配区域左上角Y坐标
    • width:匹配区域宽度
    • height:匹配区域高度
    • score:匹配相似度分数

示例

lua
-- 读取源图和模板图
local srcMat = ensure24BitBGR(imread("dt.png"))
local templateMat = ensure24BitBGR(imread("mb3.jpg"))

local status, results = templateMatchingStandard(srcMat , templateMat , 0, 0, 0, 0, 0.8, true)
if status == 1 and results and #results > 0 then
    for i, match in ipairs(results) do
        print(string.format("匹配%d: 位置=(%d,%d) 大小=(%d×%d) 相似度=%.2f",
            i, match.x, match.y, match.width, match.height, match.score))
    end
elseif status == 0 then
    print("未找到匹配目标")
elseif status == -2 then
    print("输入参数错误")
elseif status == -100 then
    print("搜索区域坐标无效")
end

多尺度单目标模板匹配

多尺度单目标模板匹配

lua
multiScaleTemplateMatching(bigImg, smallImg, x1, y1, x2, y2, scaleMin, scaleMax, scaleStep)

功能:在不同缩放尺度下搜索与模板图最匹配的单个目标

参数

  • bigImg:大图RGB888对象(待搜索的图像)
  • smallImg:模板图RGB888对象(用于匹配的模板)
  • x1:搜索区域左上角X坐标(0表示从图像左边界开始)
  • y1:搜索区域左上角Y坐标(0表示从图像上边界开始)
  • x2:搜索区域右下角X坐标(0表示到图像右边界)
  • y2:搜索区域右下角Y坐标(0表示到图像下边界)
  • scaleMin:最小缩放比例(如0.5表示缩小到50%)
  • scaleMax:最大缩放比例(如2.0表示放大到200%)
  • scaleStep:缩放步长(如0.1表示每次增加10%)

返回值

  • status:状态码(1成功,0未找到,-2输入错误,-100坐标无效)
  • results:匹配结果数组,每个结果包含属性:
    • x:匹配区域左上角X坐标
    • y:匹配区域左上角Y坐标
    • width:匹配区域宽度
    • height:匹配区域高度
    • score:匹配相似度分数

示例

lua
-- 读取源图和模板图
local srcMat = ensure24BitBGR(imread("dt.png"))
local templateMat = ensure24BitBGR(imread("mb3.jpg"))

print("【3】多尺度单目标模板匹配")

local status3, results3 = multiScaleTemplateMatching(srcMat , templateMat, 0, 0, 0, 0, 0.5, 2.0, 0.1)

if status3 == 1 and #results3 > 0 then
    local match = results3[1]
    local x, y, w, h, score = match[1], match[2], match[3], match[4], match[5]
    local scale = w / templateMat:cols()

    print(string.format("  找到匹配: 位置(%d, %d), 尺寸: %dx%d", x, y, math.floor(w), math.floor(h)))
    print(string.format("  缩放比例: %.3f, 相似度: %.4f", scale, score))

else
    print("  未找到匹配 (状态码: " .. status3 .. ")")
end

多尺度多目标模板匹配(带NMS)

多尺度多目标模板匹配(带NMS)

lua
multiScaleTemplateMatchingNMS(bigImg, smallImg, x1, y1, x2, y2, scaleMin, scaleMax, scaleStep, threshold, nmsIOU)

功能:在不同缩放尺度下搜索多个匹配目标,并使用NMS算法抑制重叠检测框

参数

  • bigImg:大图RGB888对象(待搜索的图像)
  • smallImg:模板图RGB888对象(用于匹配的模板)
  • x1:搜索区域左上角X坐标(0表示从图像左边界开始)
  • y1:搜索区域左上角Y坐标(0表示从图像上边界开始)
  • x2:搜索区域右下角X坐标(0表示到图像右边界)
  • y2:搜索区域右下角Y坐标(0表示到图像下边界)
  • scaleMin:最小缩放比例(如0.5表示缩小到50%)
  • scaleMax:最大缩放比例(如2.0表示放大到200%)
  • scaleStep:缩放步长(如0.1表示每次增加10%)
  • threshold:匹配阈值(0.0-1.0之间,高于此值才认为匹配成功)
  • nmsIOU:NMS的IOU阈值(0.0-1.0之间,用于抑制重叠框)

返回值

  • status:状态码(1成功,0未找到,-2输入错误,-100坐标无效)
  • results:匹配结果数组,每个结果包含属性:
    • x:匹配区域左上角X坐标
    • y:匹配区域左上角Y坐标
    • width:匹配区域宽度
    • height:匹配区域高度
    • score:匹配相似度分数

示例

lua
-- 读取源图和模板图
local srcMat = ensure24BitBGR(imread("dt.png"))
local templateMat = ensure24BitBGR(imread("mb3.jpg"))

print("【4】多尺度多目标模板匹配(带NMS去重)")
local status4, results4 = multiScaleTemplateMatchingNMS(
    srcMat , templateMat,
    0, 0, 0, 0,           -- 全图搜索
    0.5, 1.5, 0.025,        -- 缩放范围: 0.7~1.3, 步长0.1
    0.8,                  -- 匹配阈值
    0.3                   -- NMS IOU阈值
)

if status4 == 1 and #results4 > 0 then
    print("  找到 " .. #results4 .. " 个不重复的匹配位置")

    -- 定义多种颜色用于区分不同匹配
    local colors = {
        {255, 255, 0},  -- 青色
        {255, 0, 255},  -- 品红
        {0, 255, 255},  -- 黄色
        {255, 128, 0},  -- 橙色
        {128, 0, 255}   -- 紫色
    }

    for i = 1, #results4 do
        local match = results4[i]
        local x, y, w, h, score = match[1], match[2], match[3], match[4], match[5]
        local scale = w / templateMat:cols()

        print(string.format("    #%d: 位置(%d, %d), 尺寸: %dx%d, 缩放: %.2fx, 分数: %.4f",
                            i, x, y, math.floor(w), math.floor(h), scale, score))

        -- 循环使用颜色
        local colorIdx = ((i - 1) % #colors) + 1
        local color = colors[colorIdx]

    end

else
    print("  未找到匹配 (状态码: " .. status4 .. ")")
end