T31开发笔记: 移动侦测

news/2024/9/23 8:54:00/

若该文为原创文章,转载请注明原文出处。

最近在测试创安源IPC时发现摄像头的视频流有移动侦测功能 ,拆解后发现使用的是T31,刚好手头上有淘宝买50多点的T31摄像头,就自己现在了个简易DEMO测试一下。

一、硬件和开发环境

1、硬件:T31X+SC5235 

2、开发环境: ubuntu16.04-64bit

3、编译器:mips-gcc540-glibc222-32bit-r3.3.0.tar.gz

注:板子和和WIFI模块是某淘上淘的,使用的是RTL8188,使用的是USB接口,uboot和内核是自己裁剪移植的,内核默认自带WIFI驱动,所以不用移植可以直接使用。

二、移动侦测原理

以前有使用过海思hi3516ev200的移动侦测功能,感觉原理差不多。

运行的demo是sample-Encoder-h264-IVS-base-move.c

根据DEMO,移动侦测使用的是子流640*360,以区域方式来检测是否有移动,有移动输出1,

即把640*360分成45*80个8*8的区域

由此知道了移动的大概位置。而我试验的目的是通过这些区域算坐标并画框显示在界面上。

三、使用步骤

IMP 通过IVS的通用接口API调用实例化的IMPIVSInterface将智能化分析算法嵌入到SDK中来分析SDK中的frame图像。

IMPIVSInterface为通用算法接口,具体算法通过实现此接口并将其传给IMP IVS达到在SDK运行具体算法的目的。

一个channel有且仅为单个算法示例的载体,必须将具体实现的算法接口传给具体的channel才能在SDK中运行算法。

IMPIVSInterface 成员 param 为成员函数 init 的参数。

IMP_IVS 会在传给成员函数 ProcessAsync 参数的 frame 时对其进行外部加锁, ProcessAsync 必须在使用完 frame 后调用 IMP_IVS_ReleaseData 释放 frame,以免死锁。

除上述通过绑定在数据流中的 IMP IVS 实现算法调用之外,还提供一种非绑定的方式实现算法 调 用 , 即 获 取 framesouce channel 的 frame 图 像 , 直 接 调 用 IMPIVSInterface 的成员函数实现算法处理。

大部分情况下,我们使用的都是不绑定的方式进行移动侦测算法的获取的。

绑定模式的算法使用方法:

非绑定模式调用IVS平台

具体的API参考API手册。

四、代码说明

sample-Encoder-h264-IVS-base-move例程已经输出了参数,结构体如下:

其他数据data表示意思个人不理解,没有变化为0,有变化不为0,有人知道望告知。

输出总的数据是3600即80*45通过下面代码他数据重新整理成一个多维数组。

把检测到的值不为0,就表示1方式的方式存在arary[45][80]的数组里。 

接下来通过算法,自己出为1的区域,

计算边界值

这个函数的作用是求一个10x10数组中值为1的元素的最大和最小行和列坐标

通过此算法,即可获取到对应的区域

附完整的测试代码:

#include <stdio.h>  
#include <limits.h> // For INT_MAX and INT_MIN  #define ROWS 10  
#define COLS 10  void findMinMaxCoordinates(int array[ROWS][COLS], int *minRow, int *minCol, int *maxRow, int *maxCol) {  *minRow = INT_MAX;  *minCol = INT_MAX;  *maxRow = INT_MIN;  *maxCol = INT_MIN;  for (int i = 0; i < ROWS; ++i) {  for (int j = 0; j < COLS; ++j) {  if (array[i][j] == 1) {  if (i < *minRow) *minRow = i;  if (j < *minCol) *minCol = j;  if (i > *maxRow) *maxRow = i;  if (j > *maxCol) *maxCol = j;  }  }  }  
}  int main() {  int array[ROWS][COLS] = {  0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,};  int minRow, minCol, maxRow, maxCol;  findMinMaxCoordinates(array, &minRow, &minCol, &maxRow, &maxCol);  if (minRow != INT_MAX && minCol != INT_MAX) {  printf("Minimum coordinates: Row = %d, Col = %d\n", minRow, minCol);  printf("Maximum coordinates: Row = %d, Col = %d\n", maxRow, maxCol);  printf("(%d, %d) (%d, %d)\n", minCol, minRow ,maxCol, maxRow);} else {  printf("No elements with value 1 found in the array.\n");  }  return 0;  
}

把获取的坐标存到p00和p01结构体内,

p00.x = minCol*8*3;
p00.y = minRow*8*3;
 
p01.x = maxCol*8*3;
p01.y = maxRow*8*3;

说明乘于8是因为roi区域是8*8, 乘于3是因为我在主码流1920*1080上叠加了OSD画框显示功能 。

所以坐标放大3倍 。

OSD画框参考的是sample_OSD.c例程。在update_thread更新线程里添加了显示框的坐标点。

五、测试结果

输出感觉有点不灵敏,具体参数还有待调试。

此方式是个人想到的一种方法,有其他方式望互相讨论。

如有侵权,或需要完整代码,请及时联系博主。


http://www.ppmy.cn/news/1426049.html

相关文章

go并发编程以及socket通信的理解

go并发编程以及socket通信的理解 文章目录 go并发编程以及socket通信的理解一、管道的简单使用二、go中的socket实现通信 一、管道的简单使用 " golang不是通过共享内存来通信&#xff0c;而是通过通信来共享内存 " 1、go简单初始化 // golang不是通过共享内存来通…

机器学习方法在测井解释上的应用-以岩性分类为例

机器学习在测井解释上的应用越来越广泛&#xff0c;主要用于提高油气勘探和开发的效率和精度。通过使用机器学习算法&#xff0c;可以从测井数据中自动识别地质特征&#xff0c;预测岩石物理性质&#xff0c;以及优化油气储层的评估和管理。 以下是机器学习在测井解释中的一些…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

python爬虫之爬取携程景点评价(5)

一、景点部分评价爬取 【携程攻略】携程旅游攻略,自助游,自驾游,出游,自由行攻略指南 (ctrip.com) import requests from bs4 import BeautifulSoupif __name__ __main__:url https://m.ctrip.com/webapp/you/commentWeb/commentList?seo0&businessId22176&busines…

阿药陪你学Java(第三讲)

第三讲&#xff1a;输入和输出 Java中的输入和输出是用户可以直观的和程序进行交互的一种方式。 所谓输出就是程序打印信息&#xff0c;比如打印计算结果到控制台显示&#xff1b;输入就是用户手动提供给程序某些数据&#xff0c;比如根据程序提示从控制台输入数字或字符串等…

js-pytorch:开启前端+AI新世界

嗨&#xff0c; 大家好&#xff0c; 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家&#xff0c; 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc&#xff0c;可…

Java作业6-Java类的基本概念三

编程1 import java.util.*;abstract class Rodent//抽象类 {public abstract String findFood();//抽象方法public abstract String chewFood(); } class Mouse extends Rodent {public String findFood(){ return "大米"; }public String chewFood(){ return "…

Windows如何下载Bun并在前端Vue或React项目上替代Yarn或Npm

Bun Bun网站 Bun 在 Windows 上下载并安装 Bun 非常简单。你可以使用以下命令在 Windows 10 或更高版本上安装 Bun powershell -c "irm bun.sh/install.ps1 | iex"“powershell”不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 PowerShell 命令解决…