Appearance
视觉功能模块
初始化摄像头
初始化摄像头
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("模型加载失败")
endYoloV5目标检测
目标检测
lua
YoloV5DetectImg(image, nms_threshold, confidence_threshold, max_detections)功能:使用YoloV5模型对图像进行目标检测
参数:
image:输入图像(RGB888原始图像数据),opencv mat图像得通过专用函数转一下才能用nms_threshold:NMS阈值,用于抑制重叠框confidence_threshold:置信度阈值max_detections:最大检测数量
返回值:检测到的目标数组,每个目标包含属性:
cls_id:目标类别IDprop:目标置信度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("未检测到目标")
endYoloV8目标检测
目标检测
lua
YoloV8DetectImg(image, nms_threshold, confidence_threshold, max_detections)功能:使用YoloV8模型对图像进行目标检测
参数:
image:输入图像(RGB888原始图像数据),opencv mat图像得通过专用函数转一下才能用nms_threshold:NMS阈值,用于抑制重叠框confidence_threshold:置信度阈值max_detections:最大检测数量
返回值:检测到的目标数组,每个目标包含属性:
cls_id:目标类别IDprop:目标置信度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