星期一 03月02日
1、解决问题Ubuntu18.04 人脸检测插件报错问题:
2、下午移植kmspointerdetector插件代码,编译通过,但是运行项目,插件找不到,明日继续。
3、部门周会,汇报上周工作,安排这周工作。
星期二 03月03日
1、移植kmspointerdetectecor插件,解决各种问题,最后编译通过,运行webapp 成功。
2、和部门员工讨论预约项目中的问题。会议室设备库存计算规则,预约审核通过扣除库存;会议结束退换库存;
会议状态:最近会议(当前)/下一个;
3、配合范总写技术方案文档。
星期三 03月04
1、移植kms-crowddetector插件,解决各种问题,最后编译通过,运行webapp 成功。
2、侧是kurento-player 是否支持RTSP,目前测试没成功;
星期四 03月05
1、编译移植kurento-platedetector,编译通过,但启动kms, 插件加载不成功,找到不相关库,解决问题中;
星期五 03月06
1、继续调试kurento-platedetector代码,查找为什么不能加载相关库,大概原因是C库中引用了C++中的库函数, 还没有好的解决办法;
2、完善相关会议预约项目相关模块的功能定义;
星期一 03月09
1、上午开周会,了解上周工作情况,布置这周工作任务;
2、编译 kms-chroma 插件,修改视频背景图片;图片URL不支持https,改为http URL 后o k;
星期二 03月10
1、继续查找kms-platedetector 插件加载不成功的原因,undefined symbol: TessBaseAPISetPageSegMode问题解决;
0:00:00.109822464 26548 0x559989d91cc0 WARN KurentoModuleManager ModuleManager.cpp:65:loadModule:
Module /home/sandra/kms/kms-omni-build/build-Debug/kms-platedetector/src/gst-plugins/platedetector/libplatedetector.so
cannot be loaded: /home/sandra/kms/kms-omni-build/build-Debug/kms-platedetector/src/gst-plugins/platedetector/
libplatedetector.so: undefined symbol: TessBaseAPISetPageSegMode
解决办法:在 …/kms-omni-build# vi build-Debug/CMakeCache.txt 增加以下两行:
TESSERACT_INCLUDE_DIRS:INTERNAL=/usr/local/tesseract/include
TESSERACT_LIBRARIES:INTERNAL=tesseract
程序是能运行了,但是识别有问题,目前正在找原因,如图:
见KMS控制台输出:
星期三 03月11
1、调试Hi3559A, 编码图像RTSP输出,编码图像写入命名管道,代码完成;后台运行程序会阻塞;调试不方便;
星期三 03月12
1、考虑用固定大小内存缓冲实现线程间视频数据传输;完成测试模块代码;经测试,很容易容易互相等待;还需要完善策略;
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <malloc.h>
#define DATA_BUFFER_SIZE 100000
#define w2r (p_write_pos-p_read_pos)
#define r2w (p_read_pos-p_write_pos)
#define r2e (p_end_pos-p_read_pos)
#define w2e (p_end_pos-p_write_pos)
unsigned char psz_data_buf[DATA_BUFFER_SIZE];
unsigned char* p_write_pos;
unsigned char* p_read_pos;
unsigned char* p_start_pos = psz_data_buf;
unsigned char* p_end_pos = psz_data_buf+DATA_BUFFER_SIZE;
pthread_mutex_t lock;
int xwrite(unsigned char* p_buf, int length)
{
int len = 0;
int l0,l1;
pthread_mutex_lock(&lock);
if(p_write_pos>=p_read_pos) // w > = r
{
if(w2e >=length)
{
memcpy(p_write_pos,p_buf,length);
p_write_pos += length;
len = length;
}
else
{
if( (DATA_BUFFER_SIZE-w2r ) >= length)
{
l0 = w2e;
memcpy(p_write_pos,p_buf,l0);
l1 = length-l0;
p_write_pos = p_start_pos;
memcpy(p_write_pos,p_buf,l1);
p_write_pos += l1;
len = length;
}
}
}
else // w < r
{
if( r2w >= length)
{
memcpy(p_write_pos,p_buf,length);
p_write_pos += length;
len = length;
}
}
pthread_mutex_unlock(&lock);
return len;
}
int xread(unsigned char* p_buf, int length)
{
int len = 0;
int l0,l1;
pthread_mutex_lock(&lock);
if(p_write_pos >= p_read_pos) // w > r
{
if( w2r >= length )
{
memcpy(p_buf,p_read_pos,length);
p_read_pos += length;
len = length;
}
}
else // r > w
{
if( r2e > length)
{
memcpy(p_buf,p_read_pos,length);
p_read_pos += length;
len = length;
}
else
{
if(( DATA_BUFFER_SIZE - r2w ) >= length)
{
l0 = r2e;
memcpy(p_buf,p_read_pos,l0);
l1 = length-l0;
p_read_pos = p_start_pos;
memcpy(p_buf,p_read_pos,l1);
p_read_pos += l1;
len = length;
}
}
}
pthread_mutex_unlock(&lock);
return len ;
}
void* do_write_func()
{
unsigned char buf[256];
int len = 0;
for(int i = 0; i<256; i++)
{
buf[i] = i;
}
while(1)
{
len = xwrite(buf,256);
if(len == 0)
{
printf("+++++++do_write_func usleep(100)+++++++++++\n");
usleep(100);
}
}
}
void printx(unsigned char *buf,int len)
{
for(int i = 0; i<len; i++)
{
printf("%6d",buf[i]);
if(i%20==0)
{
printf("\n");
}
}
printf("\n");
}
void* do_read_func()
{
unsigned char buf[1024];
int len = 0;
memset(buf,0,1024);
while(1)
{
len = xread(buf,1024);
if( len == 0 )
{
printf("+++++++do_read_func usleep(100)+++++++++++\n");
usleep(100);
}
// else
// printx(buf,len);
// else
// {
// printx(buf,len);
// }
}
}
int main() {
memset(psz_data_buf,0,DATA_BUFFER_SIZE);
pthread_t w_thread,r_thread;
p_write_pos = p_start_pos;
p_read_pos = p_start_pos;
pthread_mutex_init(&lock,NULL);
pthread_create(&w_thread,NULL,do_write_func,NULL);
pthread_create(&r_thread,NULL,do_read_func,NULL);
while(1)
{
printf("hello world!\n");
sleep(5);
}
return 0;
}
星期五 03月13
1、申请百度人脸识别SDK延期;
2、下载百度人脸识别最新版4.0SDK ;在安卓5.0版SDK编译通过;安装到RK3288 屏, 终端授权出问题;
3、解决终端授权问题
注意事项:
终端的时钟一定要是当前时间;不然授权通不过;将终端的时钟设置为自动网络获取;
4、测试,摄像头不好用,打不开;下星期在测试; 设备有一个USB接口不好用。
星期一 03月16
1、部门周会,上周工作完成情况,下周工作任务安排;
2、申请购买,额温枪 1 只;
3、修改人脸识别app,响应遥控按键;部分页面修改完成。
4、app人脸识别加入口罩识别,测试OK;
5、做加油站项目软件开发预算,完成。
6、软著申请安排人员对接;
7、开机盖,换摄像头,测试OK。
星期二 03月17
1、修改人脸识别+口罩应用中遥控上下键焦点响应问题,页面太多,后面继续;
2、下午热成像摄像头来;在RK3399板子上运行,系统闪退,重新更新image, 照样闪退;
3、换到3288主板,OK,编译热成像DEMO APP,解决启动APP加载库时找不到xxx.so问题;
在 build.gradle 文件中加入
android {
...
defaultConfig{
...
ndk {
// 设置支持的SO库架构 //'armeabi' ,'arm64-v8a' /*, 'x86'*///, 'armeabi-v7a', 'x86_64', 'arm64-v8a'
abiFilters 'armeabi-v7a','arm64-v8a'
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
...
}
...
}
defaultConfig {
applicationId "com.avsgm.ixthermalimaging"
minSdkVersion 22
targetSdkVersion 25
versionCode 1
versionName "1.0"
ndk {
// 设置支持的SO库架构 //'armeabi' ,'arm64-v8a' /*, 'x86'*///, 'armeabi-v7a', 'x86_64', 'arm64-v8a'
abiFilters 'armeabi-v7a','arm64-v8a'
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
检测温度偏低,明天更新最新版程序再进行测试;
4、下午1:30开项目申请会议;
5、和领导讨论加油项目预算和实现技术可行相关问题;
星期三 03月18
1、安卓热成像温度检测调试;
更新最新版本,温度测试可纠正;测试基本满足需求;
2、仪电额温枪安卓蓝牙通讯调试,监听蓝牙扫描设备,回调函数实现数据通讯协议;发现问题,扫描一段时间后系统会自动停止扫描;需要程序再次启动扫描;
3、热成像相机今天送了一台;明天再调试相关程序;
相关代码:
初始化:
BluetoothAdapter.getDefaultAdapter().startDiscovery();
BluetoothAdapter.getDefaultAdapter().startLeScan(mLeScanCallback);
mLEScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
//mLEScanner.
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
回调函数:
private String lastBluetoothMac = "GMT";
private int lastBluetoothCode = 0x1FF;
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
//scanRecord存放广播和扫描应答数据,rssi存放扫描获取的rssi值
int code;
if(device.getName()!=null)
{
if (device.getName().contains("iEartYK")) {
final String deviceName = "设备名:" + device.getName();
final String deviceAddr = "Mac地址:" + device.getAddress();
final String broadcastPack = "广播包:" + byteToHex(scanRecord);
final String rssiString = "RSSI:" + String.valueOf(rssi) + "dB";
float temp =((scanRecord[6]^scanRecord[8])*256+(scanRecord[7]^scanRecord[8]))/10.0f;
code = scanRecord[8];
if(deviceAddr.equals(lastBluetoothMac)==false||lastBluetoothCode!=code) {
Log.i("Test", "++++++++++++deviceName = " + deviceName);
Log.i("Test", "++++++++++++deviceAddr = " + deviceAddr);
Log.i("Test", "++++++++++++broadcastPack = " + broadcastPack);
Log.i("Test", "++++++++++++rssiString = " + rssiString);
Log.i("Test", "++++++++++++temp = " + temp);
}
lastBluetoothMac = deviceAddr;
lastBluetoothCode = code;
}
}
}
星期四 03月19
1、上午调试热成像相机,熟悉相关文档,和安装测试客户端软件;
2、编译和测试热成像相机sdk,视频有时无故停止;
3、继续修改人脸识别app,响应遥控按键,页面太多,明天继续。
4、下午收到深圳r k 3399主板一块。
星期五 03月20
1、上午部门开会,会议预约项目进度太慢,工作没有积极性,不主动。
2、沈总来电,有拼接屏项目需要提供技术支持;
3、和马总进行项目沟通,项目概况,3层楼需要进行信息化改造;由拼接屏,视频会议预约,信息发布需求;
需要提供产品功能简介;
4、下午继续修改人脸识别APP,未完待续;
5、公司其它部门人员无法提供,只能自己写产品功能简介;
星期一 03月23日
1、上午部门周会,项目进度任务安排;
2、讨论模版功能模块机页面设计;
星期二 03月24日
1、上午参加沈-夏普的客户会议;介绍公司相关产品;
2、下午寄来一台整机和双目摄像头,拆机,双目摄像头暂时用不了,需要相关线材;
星期三 03月25日
1、开始在人脸识别中集成热成像,代码修改完毕,测试热成像不出图。正在找原因。
星期四 03月26日
1、继续调试代码,热成像设备已经连接成功,温度也有数据,说明设备已经工作,代码日志输出surfaceview的width,height为0,修改后图像出来。
2,修改相关代码。集成工作完成;
星期五 03月27日
1、和同事出差杭州,早上8:55的高铁到杭州,张曙有和医院健康管理的相关需求;上午到对方公司介绍公司业务和进行展示;
2、下午进行向对方远程演示拼接屏功能,对方满意。
3、和张曙沟通,了解具体需求;
他们公司新建才3月,1、需要做网站,2、业务管理系统+行政管理,3、拼接屏展示
4、下午5:16的高铁返程。
星期一 03月31日
1、上午开部门周会,回顾上周工作,布置这周任务;
2、下午开始更换疫情防控平台终端设备UI,调整布局,部分完成;明天继续;
星期二 04日01日
1、继续完成疫情防控平台终端设备相关功能;实现RecyclerView 及相关功能,还要继续优化;
星期三 04日02日
1、继续完成疫情防控平台终端设备相关功能,优化陌生人检测和人脸截图刷新问题;
2、对接蓝牙额温枪检测功能基本完成;功能样机如图。
星期四 04日03日
1、将疫情检测设备带去上海工程技术大学演示,主要设备的系统时间问题。
2、下午讨论信息化项目疫情防控综合管理系统功能模块及实现,内容如下;
疫情安全防控综合管理系统
一、 系统软件
1、 疫情智能监测系统(场景-门口/宿舍楼/教室/食堂/图书馆)
功能描述:
(1) 人脸信息采集;
(2) 人脸识别;
(3) 口罩识别;
(4) 定位/定时/基于位置信息采集;
(5) 环境温/湿度
(6) 空气质量/烟雾
功能模块:用户权限管理、实时检测人数统计、异常统计、信息通知、检测报表、统计分析、监测设备管理、日志管理、系统设置
2、 疫情异常人员追踪系统
功能描述:
(1) 人脸特征采集;
(2) 异常人员发现;
(3) 异常人员追踪及行为轨迹;
(4) 区域闯入报警
(5) 相关区域预警信息通知到达;
(6) 邮件/短信/通知各级部门;
(7) 疫情分析数据报表
3、 疫情管控可视化管理系统(疫情大数据展示+监控视频平台+应急信息发布平台)
功能描述:
(1) 校园疫情安全防控综合管里系统、监控管理平台、信息发布平台展示;
(2) 实时监控视频展示;
(3) 视频会议接入;
二、系统设备组成
(1) 体温监测测\口罩\人脸识别\终端设备-测温(人脸+热成像+5G+蓝牙);
(2) 蓝牙额温枪
(3) 远距离热成像摄像机
(4) 视频拼接处理器;
(5) LED拼接屏;
(6) 高清/4K/8K摄像头(5G);
(7) 服务器集群;
4、完成网络拓扑图