Commit 39527c30 authored by 郝文豪's avatar 郝文豪

修改init接口,init初始化传入路径,改变数据库存放位置,新增一次上传3张图片的接口,50版本

parent 3604182b
No preview for this file type
......@@ -138,6 +138,41 @@ int CommonTools::upload_file(const char* url, const char* fileName, string& resp
//return 0;
}
int CommonTools::upload_file1(const char* url, const char* fileName1, const char* fileName2, const char* fileName3,vector<string>&res, string& response) {
CURL* curl;
CURLcode ret;
curl = curl_easy_init();
struct curl_httppost* post = NULL;
struct curl_httppost* last = NULL;
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url); //指定url
curl_formadd(&post, &last, CURLFORM_PTRNAME, "path", CURLFORM_PTRCONTENTS, "device_cover", CURLFORM_END);//form-data key(path) 和 value(device_cover)
curl_formadd(&post, &last, CURLFORM_PTRNAME, "file", CURLFORM_FILE, fileName1, CURLFORM_FILENAME,res[0].c_str(), CURLFORM_END);// form-data key(file) "./test.jpg"为文件路径 "hello.jpg" 为文件上传时文件名
curl_formadd(&post, &last, CURLFORM_PTRNAME, "file2", CURLFORM_FILE, fileName2, CURLFORM_FILENAME, res[1].c_str(), CURLFORM_END);
curl_formadd(&post, &last, CURLFORM_PTRNAME, "file3", CURLFORM_FILE, fileName3, CURLFORM_FILENAME, res[2].c_str(), CURLFORM_END);
curl_formadd(&post, &last, CURLFORM_PTRNAME,"type", CURLFORM_PTRCONTENTS, res[3].c_str(), CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); //构造post参数
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //绑定相应
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response); //绑定响应内容的地址
ret = curl_easy_perform(curl); //执行请求
if (ret == 0) {
curl_easy_cleanup(curl);
return 0;
}
else {
return ret;
}
}
else {
return -1;
}
}
int CommonTools::download_file(const char* url, const char outfilename[FILENAME_MAX]) {
CURL* curl;
FILE* fp;
......
......@@ -25,6 +25,7 @@ public:
static int download_file(const char* url, const char outfilename[FILENAME_MAX]);
// 文件上传
static int upload_file(const char* url, const char* fileName, string& response);
static int upload_file1(const char* url, const char* fileName1, const char* fileName2, const char* fileName3, vector<string>& res, string& response);
// http get 请求
static CURLcode HttpGet(const std::string& strUrl, std::string& strResponse, int nTimeout);
// htpp post 请求
......
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\vc142.pdb
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmacekg-x86.obj
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\dllmain.obj
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\cppsqlite3.obj
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\commontools.obj
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\characterconversion.obj
c:\users\zhxx\desktop\work\fresh-plug-ins\bin\x86\wmacekg-x86.dll
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmacekg-x86.ipdb
c:\users\zhxx\desktop\work\fresh-plug-ins\bin\x86\wmacekg-x86.pdb
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmacekg-x86.iobj
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll-x86.res
c:\users\zhxx\desktop\work\fresh-plug-ins\bin\x86\wmacekg-x86.lib
c:\users\zhxx\desktop\work\fresh-plug-ins\bin\x86\wmacekg-x86.exp
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\cl.command.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\cl.read.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\cl.write.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\link.command.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\link.read.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\link.write.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\rc.command.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\rc.read.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\rc.write.1.tlog
c:\users\zhxx\desktop\work\fresh-plug-ins\release\x86\wmai-dll.tlog\wmai-dll.write.1u.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\vc142.pdb
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmacekg-x86.obj
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\dllmain.obj
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\cppsqlite3.obj
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\commontools.obj
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\characterconversion.obj
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll-x86.res
c:\users\1\documents\fresh-plug-ins-dll-new\bin\x86\wmacekg-x86.dll
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\cl.command.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\cl.read.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\cl.write.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\link.command.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\link.read.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\link.write.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\rc.command.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\rc.read.1.tlog
c:\users\1\documents\fresh-plug-ins-dll-new\release\x86\wmai-dll.tlog\rc.write.1.tlog
......@@ -2,7 +2,7 @@
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\WmAceKG-x86.dll</FullPath>
<FullPath>C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\WmAceKG-x86.dll</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
......
No preview for this file type
No preview for this file type
 CharacterConversion.cpp
C:\Users\zhxx\Desktop\work\fresh-plug-ins\CharacterConversion.cpp(29,10): warning C4244: “=”: 从“_Ty”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\CharacterConversion.cpp(29,10): warning C4244: “=”: 从“_Ty”转换到“float”,可能丢失数据
with
[
_Ty=int
......@@ -8,41 +8,44 @@ C:\Users\zhxx\Desktop\work\fresh-plug-ins\CharacterConversion.cpp(29,10): warnin
CppSQLite3.cpp
dllmain.cpp
WmAceKG-x86.cpp
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(537,17): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(907,20): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(917,18): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(934,16): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1030,20): warning C4244: “初始化”: 从“int”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1031,20): warning C4244: “初始化”: 从“int”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1121,17): warning C4244: “初始化”: 从“time_t”转换到“long”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1236,45): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1409,18): warning C4477: “sprintf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“const _Elem *”
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(557,17): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(937,20): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(947,18): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(973,16): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1105,20): warning C4244: “初始化”: 从“int”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1106,20): warning C4244: “初始化”: 从“int”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1196,17): warning C4244: “初始化”: 从“time_t”转换到“long”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1321,45): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1510,18): warning C4477: “sprintf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“const _Elem *”
with
[
_Elem=char
]
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1409,18): warning C4477: “sprintf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 8 拥有了类型“const _Elem *”
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1510,18): warning C4477: “sprintf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 8 拥有了类型“const _Elem *”
with
[
_Elem=char
]
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1577,23): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1652,34): warning C4244: “参数”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1833,34): warning C4244: “参数”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(2089,22): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(2134,27): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(2312,26): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(2924,21): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3012,20): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3164,21): warning C4244: “参数”: 从“float”转换到“DWORD”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3191,33): warning C4018: “>”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3225,34): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3259,37): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3270,36): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3311,15): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3325,26): warning C4244: “=”: 从“UINT64”转换到“unsigned long”,可能丢失数据
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(3346,13): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\type_traits(1595,98): warning C4244: “参数”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1678,23): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1781,34): warning C4244: “参数”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1970,34): warning C4244: “参数”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(2226,22): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(2271,27): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(2454,27): warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3068,21): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3156,20): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3359,21): warning C4244: “参数”: 从“float”转换到“DWORD”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3386,33): warning C4018: “>”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3431,34): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3408,8): warning C4101: “cropPath”: 未引用的局部变量
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3407,8): warning C4101: “rawPath”: 未引用的局部变量
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3591,37): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3607,36): warning C4018: “<”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3648,15): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3658,34): warning C4018: “>”: 有符号/无符号不匹配
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3667,26): warning C4244: “=”: 从“UINT64”转换到“unsigned long”,可能丢失数据
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(3689,13): warning C4244: “初始化”: 从“clock_t”转换到“float”,可能丢失数据
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\type_traits(1534,98): warning C4244: “参数”: 从“double”转换到“float”,可能丢失数据
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\thread(51): message : 查看对正在编译的函数 模板 实例化“int std::invoke<int(__cdecl *)(std::string,int,float,float,std::string,std::string,std::string,std::string),std::basic_string<char,std::char_traits<char>,std::allocator<char>>,int,int,double,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>(_Callable &&,_Ty1 &&,int &&,int &&,double &&,std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&,std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&,std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&,std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&) noexcept(false)”的引用
with
[
......@@ -61,12 +64,12 @@ C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.2
_Ty=int,
_Fn=int (__cdecl &)(std::string,int,float,float,std::string,std::string,std::string,std::string)
]
C:\Users\zhxx\Desktop\work\fresh-plug-ins\WmAceKG-x86.cpp(1755): message : 查看对正在编译的函数 模板 实例化“std::thread::thread<int(__cdecl &)(std::string,int,float,float,std::string,std::string,std::string,std::string),std::string&,int,int,double&,std::string,std::string,std::string,std::string,0>(_Fn,std::string &,int &&,int &&,double &,std::string &&,std::string &&,std::string &&,std::string &&)”的引用
C:\Users\1\Documents\fresh-plug-ins-dll-new\WmAceKG-x86.cpp(1886): message : 查看对正在编译的函数 模板 实例化“std::thread::thread<int(__cdecl &)(std::string,int,float,float,std::string,std::string,std::string,std::string),std::string&,int,int,double&,std::string,std::string,std::string,std::string,0>(_Fn,std::string &,int &&,int &&,double &,std::string &&,std::string &&,std::string &&,std::string &&)”的引用
with
[
_Fn=int (__cdecl &)(std::string,int,float,float,std::string,std::string,std::string,std::string)
]
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\type_traits(1595,98): warning C4244: “参数”: 从“int”转换到“float”,可能丢失数据
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\type_traits(1534,98): warning C4244: “参数”: 从“int”转换到“float”,可能丢失数据
正在生成代码...
正在创建库 .\bin\x86\WmAceKG-x86.lib 和对象 .\bin\x86\WmAceKG-x86.exp
正在生成代码
......@@ -74,13 +77,13 @@ C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.2
D:\Projects\videopipe\libvideopipe\libvideopipe\src\utils.cpp(162): warning C4172: 返回局部变量或临时变量的地址: re_time
All 1870 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
ret.lib(libhnsw.obj) : warning LNK4099: 未找到 PDB“libhnsw.pdb”(使用“ret.lib(libhnsw.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\libhnsw.pdb”中寻找);正在链接对象,如同没有调试信息一样
ret.lib(opencv_matoperations.obj) : warning LNK4099: 未找到 PDB“libhnsw.pdb”(使用“ret.lib(opencv_matoperations.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\libhnsw.pdb”中寻找);正在链接对象,如同没有调试信息一样
ret.lib(mnn_matoperations.obj) : warning LNK4099: 未找到 PDB“libhnsw.pdb”(使用“ret.lib(mnn_matoperations.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\libhnsw.pdb”中寻找);正在链接对象,如同没有调试信息一样
ret.lib(libmatmul_topk.obj) : warning LNK4099: 未找到 PDB“matmul_topk.pdb”(使用“ret.lib(libmatmul_topk.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\matmul_topk.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(video_motion_pipe.obj) : warning LNK4099: 未找到 PDB“libvideopipe.pdb”(使用“libvideopipe.lib(video_motion_pipe.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\libvideopipe.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(libio3_lat3d_c3d.obj) : warning LNK4099: 未找到 PDB“io3_lat3d_c3d.pdb”(使用“libvideopipe.lib(libio3_lat3d_c3d.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\io3_lat3d_c3d.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(libio3_lat3d_backbone.obj) : warning LNK4099: 未找到 PDB“io3_lat3d_backbone.pdb”(使用“libvideopipe.lib(libio3_lat3d_backbone.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\io3_lat3d_backbone.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(utils.obj) : warning LNK4099: 未找到 PDB“libvideopipe.pdb”(使用“libvideopipe.lib(utils.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\libvideopipe.pdb”中寻找);正在链接对象,如同没有调试信息一样
libretri.lib(libretri.obj) : warning LNK4099: 未找到 PDB“retri.pdb”(使用“libretri.lib(libretri.obj)”或在“C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\retri.pdb”中寻找);正在链接对象,如同没有调试信息一样
wmai-dll-x86.vcxproj -> C:\Users\zhxx\Desktop\work\fresh-plug-ins\bin\x86\WmAceKG-x86.dll
ret.lib(libhnsw.obj) : warning LNK4099: 未找到 PDB“libhnsw.pdb”(使用“ret.lib(libhnsw.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\libhnsw.pdb”中寻找);正在链接对象,如同没有调试信息一样
ret.lib(opencv_matoperations.obj) : warning LNK4099: 未找到 PDB“libhnsw.pdb”(使用“ret.lib(opencv_matoperations.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\libhnsw.pdb”中寻找);正在链接对象,如同没有调试信息一样
ret.lib(mnn_matoperations.obj) : warning LNK4099: 未找到 PDB“libhnsw.pdb”(使用“ret.lib(mnn_matoperations.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\libhnsw.pdb”中寻找);正在链接对象,如同没有调试信息一样
ret.lib(libmatmul_topk.obj) : warning LNK4099: 未找到 PDB“matmul_topk.pdb”(使用“ret.lib(libmatmul_topk.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\matmul_topk.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(video_motion_pipe.obj) : warning LNK4099: 未找到 PDB“libvideopipe.pdb”(使用“libvideopipe.lib(video_motion_pipe.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\libvideopipe.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(libio3_lat3d_c3d.obj) : warning LNK4099: 未找到 PDB“io3_lat3d_c3d.pdb”(使用“libvideopipe.lib(libio3_lat3d_c3d.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\io3_lat3d_c3d.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(libio3_lat3d_backbone.obj) : warning LNK4099: 未找到 PDB“io3_lat3d_backbone.pdb”(使用“libvideopipe.lib(libio3_lat3d_backbone.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\io3_lat3d_backbone.pdb”中寻找);正在链接对象,如同没有调试信息一样
libvideopipe.lib(utils.obj) : warning LNK4099: 未找到 PDB“libvideopipe.pdb”(使用“libvideopipe.lib(utils.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\libvideopipe.pdb”中寻找);正在链接对象,如同没有调试信息一样
libretri.lib(libretri.obj) : warning LNK4099: 未找到 PDB“retri.pdb”(使用“libretri.lib(libretri.obj)”或在“C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\retri.pdb”中寻找);正在链接对象,如同没有调试信息一样
wmai-dll-x86.vcxproj -> C:\Users\1\Documents\fresh-plug-ins-dll-new\bin\x86\WmAceKG-x86.dll
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\CHARACTERCONVERSION.CPP
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\CHARACTERCONVERSION.CPP
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\CHARACTERCONVERSION.CPP|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\COMMONTOOLS.CPP|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\CPPSQLITE3.CPP|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\DLLMAIN.CPP|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\WMACEKG-X86.CPP
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\CHARACTERCONVERSION.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\COMMONTOOLS.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\CPPSQLITE3.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\DLLMAIN.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\WMACEKG-X86.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\WMAI-DLL-X86.RES
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\CHARACTERCONVERSION.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\COMMONTOOLS.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\CPPSQLITE3.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\DLLMAIN.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\WMACEKG-X86.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\WMAI-DLL-X86.RES
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\CHARACTERCONVERSION.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\COMMONTOOLS.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\CPPSQLITE3.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\DLLMAIN.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\WMACEKG-X86.OBJ|C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\RELEASE\X86\WMAI-DLL-X86.RES
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\WMAI-DLL-X86.RC
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\WMAI-DLL-X86.RC
......
B^C:\USERS\1\DOCUMENTS\FRESH-PLUG-INS-DLL-NEW\WMAI-DLL-X86.RC
......
PlatformToolSet=v142:VCToolArchitecture=Native64Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.19041.0:
Release|Win32|C:\Users\zhxx\Desktop\work\fresh-plug-ins\|
Release|Win32|C:\Users\1\Documents\fresh-plug-ins-dll-new\|
B^C:\Users\1\Documents\fresh-plug-ins-dll-new\wmai-dll-x86.vcxproj
......
......@@ -67,10 +67,19 @@
#define FRESH_DETECT 0
#define PREVENT_LOSS 1
#define VIDEOCOUNT 49
#define VIDEOCOINTIN 49
//纠错存 code和id
unordered_map<string, int>reassion;
string realProductCodes[10];
//空盘图向量
float feature_empty[FEATURE_COUNT];
//视频流存图
int rest_count;
int rest_in = 0;
int rest_out = 0;
using namespace std;
using namespace cv;
using namespace rapidjson;
......@@ -86,7 +95,7 @@ struct DETECT_RESULT
{
char productCodes[100];
char sessionId[100];
bool state;
int state;
};
struct FOOD_PARAM_DATA
......@@ -102,6 +111,7 @@ struct FOOD_PARAM_DATA
int max_in_frame_queue; // 最大缓存图片数
queue<VIDEO_FRAME_INFO> frame_in; // q1
queue<libvideopipe::FOOD_VIDEOPIPE_INPUT> videopipe_in; // q2
vector<VIDEO_FRAME_INFO> frame_out; // q2
HANDLE hMutex; //互斥量
bool debug_mode; // 是否启用调试
......@@ -121,7 +131,7 @@ DETECT_RESULT result;
FOOD_PARAM_DATA param_in;
//文件的路径
const char* gszFile = "featurexYz.db";
const char *gszFile = "featurexYz.db";
const char* log_path = "logs/daily.txt";
std::shared_ptr<spdlog::logger> logger;
vector<float>solve_cost;
......@@ -155,6 +165,8 @@ const char* wmpos_unbind_url = "%s.wmdigit.com/%s/newretail/api/pos/machine/unbi
const char* save_record_url = "%s.wmdigit.com/%s/newretail/api/search/product/saveImageIdentify";
// 上传文件
const char* upload_file_url = "%s.wmdigit.com/%s/newretail/api/dfs/upload";
// 上传视频流的照片文件
const char* upload_file1_url = "%s.wmdigit.com/%s/newretail/api/dfs/upload2";
// 重置mac地址为有线网卡的mac 地址
const char* reset_mac_url = "%s.wmdigit.com/%s/newretail/api/pos/machine/updateMacByOld";
// 验证租户是否正确
......@@ -232,6 +244,10 @@ bool g_video_init = false;
//防止多次初始化
bool init_finish = false;
// 是否触发视频流识别
bool video_detect = true;
/*******************************Socket相关************************************/
bool openSync = false;
// TCP服务端口
......@@ -311,6 +327,10 @@ float average_cost()
}
float ret = solve_cost[0];
solve_cost.erase(solve_cost.begin());
if (ret > 3000)
{
ret = 3000;
}
if (ret < 67)
{
ret = 67;
......@@ -778,7 +798,7 @@ int retri_Init() {
ret = RETRI_Init(NULL, RETRI_DEVICE::RETRI_GPU, &handle);
}
if (ret != 0) {
logger->info("初始化元芒图像加速库失败:{0:x}",ret);
logger->info("初始化元芒图像加速库失败:{o:x}",ret);
return -1;
}
else {
......@@ -786,17 +806,19 @@ int retri_Init() {
return 0;
}
}
/**
* 初始化faiss索引
*/
int WMAI_API Init() {
int WMAI_API Init(char* path) {
if (init_finish == true)
{
logger->info("二次初始化");
return 0;
}
#if APPOINT_LIBRARY
char DllPath[MAX_PATH] = { 0 };
GetModuleFileNameA((HINSTANCE)&__ImageBase, DllPath, _countof(DllPath));
......@@ -859,10 +881,10 @@ int WMAI_API Init() {
logger->flush_on(spdlog::level::info);
delete_daily();
}
FILE* fp = fopen(json_path, "rb"); // 非 Windows 平台使用 "r"
if (fp) {
char readBuffer[65536];
char readBuffer[65536];
FileReadStream is(fp, readBuffer, sizeof(readBuffer));
Document d;
d.ParseStream(is);
......@@ -877,60 +899,77 @@ int WMAI_API Init() {
cameraNum = d["cameraNum"].GetInt();
fclose(fp);
}
/*char* json_ten = new char[MAX_PATH];
string ascll_ten_file = string(path) + "\\" + "tenant.json";
string utf_8_ten_file = ASCII2UTF_8(ascll_ten_file);
std::strcpy(json_ten, utf_8_ten_file.c_str());
json_tenant_path = json_ten;*/
FILE* fp2 = fopen(json_tenant_path, "rb"); // 非 Windows 平台使用 "r"
if (fp2) {
char readBuffer2[65536];
FileReadStream is2(fp2, readBuffer2, sizeof(readBuffer2));
Document d2;
d2.ParseStream(is2);
tenantStr = d2["demo"].GetString();
fclose(fp2);
char readBuffer2[65536];
FileReadStream is2(fp2, readBuffer2, sizeof(readBuffer2));
Document d2;
d2.ParseStream(is2);
tenantStr = d2["demo"].GetString();
fclose(fp2);
}
FILE* fp3 = fopen(posId_json_path, "rb"); // 非 Windows 平台使用 "r"
if (fp3) {
char readBuffer3[65536];
FileReadStream is3(fp3, readBuffer3, sizeof(readBuffer3));
Document d3;
d3.ParseStream(is3);
char readBuffer3[65536];
FileReadStream is3(fp3, readBuffer3, sizeof(readBuffer3));
Document d3;
d3.ParseStream(is3);
posId = d3["posId"].GetString();
fclose(fp3);
}
GetMacByGetAdaptersAddresses(macAddr);
del_rod(macAddr);
mINI::INIFile file(dev_ini_path);
mINI::INIStructure ini;
file.read(ini);
dev = ini["default"]["dev"];
mode = atoi(ini["default"]["mode"].c_str());
drive_ai = atoi(ini["default"]["drive_ai"].c_str());
openSync = atoi(ini["default"]["openSync"].c_str());
filterScore = atof(ini["default"]["filterScore"].c_str());
GetMacByGetAdaptersAddresses(macAddr);
del_rod(macAddr);
mINI::INIFile file(dev_ini_path);
mINI::INIStructure ini;
file.read(ini);
dev = ini["default"]["dev"];
mode = atoi(ini["default"]["mode"].c_str());
drive_ai = atoi(ini["default"]["drive_ai"].c_str());
openSync = atoi(ini["default"]["openSync"].c_str());
filterScore = atof(ini["default"]["filterScore"].c_str());
// 开始创建tcp服务端
initTcpServer();
initTcpServer();
//初始化图形加速库
int ret = retri_Init();
logger->info("图形加速库初始化结果:{0:x}", ret);
int ret = retri_Init();
logger->info("图形加速库初始化结果:{o:x}", ret);
//添加索引
float idx_start = clock();
CppSQLite3DB db;
db.open(gszFile);
db.setBusyTimeout(5000);
float idx_start = clock();
char* gsz_file = new char[MAX_PATH];
string ascll_gsz_file = string(path)+"\\" + "featurexYz.db";
string utf_8_gsz_file = ASCII2UTF_8(ascll_gsz_file);
std::strcpy(gsz_file, utf_8_gsz_file.c_str());
gszFile = gsz_file;
logger->info("gszFile is {}", gszFile);
CppSQLite3DB db;
db.open(gszFile);
db.setBusyTimeout(5000);
if (db.tableExists("feature_code")) {
CppSQLite3Query queryColumn3 = db.execQuery("select * from sqlite_master where name='feature_code' and sql like '%deleted%';");
CppSQLite3Query queryColumn3 = db.execQuery("select * from sqlite_master where name='feature_code' and sql like '%deleted%';");
if (queryColumn3.eof()) {
//没有 "列名" 列
//新增列
db.execDML("ALTER TABLE feature_code ADD COLUMN deleted INTEGER DEFAULT 0;");
db.execDML("ALTER TABLE feature_code ADD COLUMN deleted INTEGER DEFAULT 0;");
}
}
idx = new libhnsw::Index(FEATURE_COUNT, DATABASE_SIZE, libhnsw::BRUTE_FORCE_KNN_CF);
loadIndexFromDB(db, idx);
idx = new libhnsw::Index(FEATURE_COUNT, DATABASE_SIZE, libhnsw::BRUTE_FORCE_KNN_CF,libhnsw::INNER_PRODUCT);
loadIndexFromDB(db, idx);
float idx_end = clock();
logger->info("idx init cost:{}",idx_end - idx_start);
......@@ -940,7 +979,7 @@ int WMAI_API Init() {
int row = db.execDML(deleteProductRecord);
logger->info("{} row product_record has been deleted", row);
}
db.execDML("CREATE TABLE IF NOT EXISTS product_model (id integer PRIMARY KEY AUTOINCREMENT, product_code text NOT NULL, model_code integer NOT NULL);");
db.execDML("CREATE TABLE IF NOT EXISTS product_model_counting (id integer PRIMARY KEY AUTOINCREMENT, product_code text NOT NULL, model_code integer NOT NULL, num integer NOT NULL);");
db.execDML("CREATE TABLE IF NOT EXISTS feature_code (id integer PRIMARY KEY AUTOINCREMENT, code text NOT NULL, feature text NOT NULL, update_time TIMESTAMP DEFAULT NULL, deleted integer DEFAULT NULL);");
......@@ -952,29 +991,65 @@ int WMAI_API Init() {
db.execDML("CREATE TABLE IF NOT EXISTS record_count (id integer PRIMARY KEY AUTOINCREMENT, count integer NOT NULL);");;
}
//检测表单,此表单为计数
db.execDML("CREATE TABLE IF NOT EXISTS video_count (id integer PRIMARY KEY AUTOINCREMENT, count_in integer NOT NULL)");
//检测record_count表达数据
CppSQLite3Buffer measure;
measure.format("select count(*) from record_count;");
CppSQLite3Query q = db.execQuery(measure);
ret = 0;
CppSQLite3Buffer selectvideocount;
selectvideocount.format("select count(*) from video_count");
CppSQLite3Query q = db.execQuery(selectvideocount);
int pre1;
while (!q.eof())
{
ret = q.getIntField(0);
pre1 = q.getIntField(0);
break;
}
q.finalize();
logger->info("record_count ret :{}", ret);
if (pre1 == 0)
{
rest_count = 0;
logger->info("rest_count is{}", rest_count);
}
else
{
CppSQLite3Buffer selectvideo;
selectvideo.format("select count_in from video_count where id=1;");
CppSQLite3Query q2 = db.execQuery(selectvideo);
while (!q2.eof())
{
rest_count = q2.getIntField(0);
logger->info("rest_count is{}",rest_count);
break;
}
q2.finalize();
}
//检测record_count表达数据
CppSQLite3Buffer measure;
measure.format("select count(*) from record_count;");
CppSQLite3Query q1 = db.execQuery(measure);
ret = 0;
while (!q1.eof())
{
ret = q1.getIntField(0);
break;
}
q1.finalize();
logger->info("record_count ret :{}", ret);
if (ret == 0)
{
int count = 1;
CppSQLite3Buffer insert;
int count = 1;
CppSQLite3Buffer insert;
insert.format("insert into record_count(count) values (%d)", count);
db.execDML(insert);
}
if (!db.tableExists("product_record")) {
db.execDML("CREATE TABLE IF NOT EXISTS product_record (id integer PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, model_code INTEGER NOT NULL, score REAL NOT NULL,feature_value TEXT NOT NULL,image_path TEXT NOT NULL,product_ids TEXT NOT NULL,real_codes TEXT NOT NULL,time TEXT NOT NULL);");
db.execDML("CREATE INDEX session_id_index ON product_record(session_id);");
db.execDML("CREATE INDEX session_id_index ON product_record(session_id);");
}
// sqlite_master 为sqlite隐藏系统表
CppSQLite3Query queryColumn = db.execQuery("select * from sqlite_master where name='product_record' and sql like '%real_codes%';");
......@@ -989,7 +1064,7 @@ int WMAI_API Init() {
//新增列
db.execDML("ALTER TABLE feature_code ADD COLUMN update_time TIMESTAMP DEFAULT NULL;");
CppSQLite3Buffer updateFeatureCodeTime;
updateFeatureCodeTime.format("update feature_code set update_time = CURRENT_TIMESTAMP;");
updateFeatureCodeTime.format("update feature_code set update_time = datetime('now','localtime');");
db.execDML(updateFeatureCodeTime);
}
queryColumn.finalize();
......@@ -1148,6 +1223,7 @@ bool authorize() {
return authorize;
}
//static int k;
int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores, float* rhs)
{
// step1:初始化handle
......@@ -1176,13 +1252,22 @@ int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores, float*
RETRI_INPUT in_img;
in_img.img = bgr.clone();
RETRI_OUTPUT clsretri_output;
cv::imwrite("input.jpg", in_img.img);
//string inimg = tool_get_dll_path()+"in-image";
//_mkdir(inimg.c_str());
//char image_name[120] = {};
//sprintf(image_name, "\\%lld.jpg", k);
//std::string dir_path = inimg+"\\"+image_name;
//imwrite(dir_path, in_img.img);
//k++;
int s_time = clock();
int hr = RETRI_Process(in_img, &clsretri_output, handle);
int e_time = clock();
if (hr != 0)
{
logger->info("元芒图形加速库推理失败!error code:{}\n", hr);
logger->info("元芒图形加速库推理失败!error code:{0:x}\n", hr);
return -2;
}
logger->info("元芒图形加速库耗时:{}ms\n", e_time - s_time);
......@@ -1236,59 +1321,75 @@ float calculSimilar(float v1[], float v2[], int size) {
return (ret / sqrt(mod1) / sqrt(mod2) + 1) / 2.0;
}
int compare_feature_faiss(float* rhs, string* code, int& biggerNinety) {
try {
CppSQLite3DB db;
db.open(gszFile);
CppSQLite3DB db;
db.open(gszFile);
if (!db.tableExists("feature_code")) {
return 0;
return 0;
}
// ============ 搜索 ===================
reassion.clear();
double startTime1 = clock();//1计时开始
std::vector<std::pair<float, int>>res = idx->Search(rhs,6);
reassion.clear();
double startTime1 = clock();//1计时开始
//logger->info("detect feature:{}", rhs);
///
//char rhs_data[FEATURE_COUNT * 10] = { };
/* for (int i = 0; i < FEATURE_COUNT; ++i)
{
sprintf(rhs_data + strlen(rhs_data), "%f,", rhs[i]);
}
logger->info("detect feature:{}", rhs_data);*/
std::vector<std::pair<float, int>>res = idx->Search(rhs,6);
for (unsigned int j = 0; j < res.size(); j++)
{
std::pair<float, int> r = res[j];
//logger->info("res[{}]={} {}\n", j, r.first, r.second);
int number = r.second;
std::pair<float, int> r = res[j];
//logger->info("res[{}]:id {},prob {}\n", j, r.second, 1-r.first);
int number = r.second;
// 商品向量
float features[FEATURE_COUNT];
//获得对应的商品代
number = number + 1;
CppSQLite3Buffer selectFeatureCode;
selectFeatureCode.format("select code,feature,id from feature_code where id = %d;", number);
CppSQLite3Query q = db.execQuery(selectFeatureCode);
string sql_code;
float features[FEATURE_COUNT];
//获得对应的商品代
number = number + 1;
CppSQLite3Buffer selectFeatureCode;
selectFeatureCode.format("select code,feature,id from feature_code where id = %d;", number);
CppSQLite3Query q = db.execQuery(selectFeatureCode);
string sql_code;
int id;
while (!q.eof())
{
sql_code = q.getStringField(0);
const char* sql_feature = q.fieldValue(1);
id = q.getIntField(2);
char* c = const_cast<char*>(sql_feature);
char* c = const_cast<char*>(sql_feature);
split(c, features);
q.nextRow();
//logger->info("idx;{} feature:{}", j, sql_feature);
}
q.finalize();
float feature = calculSimilar(rhs, features, FEATURE_COUNT);
logger->info("{} is {}", sql_code.c_str(), feature);
if (feature > filterScore) {
// 1 2 3 7 8
// 4 5 6 9 10 (4为自学习商品代码)
code[j + 3] = sql_code;
q.finalize();
float sim = calculSimilar(rhs, features, FEATURE_COUNT);
logger->info("{} is {}", sql_code.c_str(), sim);
if (sim > filterScore)
{
code[j + 3] = sql_code;
reassion.emplace(sql_code, id);
// 如果大于过滤值 说明该向量最近被使用 修改最后更新时间
CppSQLite3Buffer updateFeatureCode;
updateFeatureCode.format("update feature_code set update_time = CURRENT_TIMESTAMP where id = %d", id);
updateFeatureCode.format("update feature_code set update_time = datetime('now','localtime') where id = %d", id);
db.execDML(updateFeatureCode);
}
if (j == 0 && feature > 0.9) {
if (j == 0 && sim > 0.9) {
logger->info("第一个向量大于0.9的置信度 置换第一个商品代码");
biggerNinety = 1;
}
// scores[j+3] = feature;
}
db.close();
......@@ -1471,14 +1572,14 @@ void saveImg(string pic_Name, cv::Mat mat) {
// 拍照
cv::Mat getScaleBitmap(char* rawPath, char* cropPath, bool saveRawImg) {
cv::Mat returnFrame, frame1, frame2, frame3;
double startTime1, endTime1, elasped;
cv::Mat returnFrame, frame1, frame2, frame3;
double startTime1, endTime1, elasped;
startTime1 = clock();//1计时开始
char pic_Name[128] = {}; //照片名称
char raw_pic_Name[128] = {}; //照片名称
char pic_Name[128] = {}; //照片名称
char raw_pic_Name[128] = {}; //照片名称
if (!cap.isOpened())
{
logger->info("The camera open failed!");
logger->info("The camera open failed!");
return returnFrame;
}
if (frame_one.empty() || frame_thr.empty() || frame_two.empty()) {
......@@ -1486,19 +1587,19 @@ cv::Mat getScaleBitmap(char* rawPath, char* cropPath, bool saveRawImg) {
return returnFrame;
}
time_t nowTime;
tm* now;
WaitForSingleObject(PhotoMutex, INFINITE);
frame1= frame_one.clone();
frame2= frame_two.clone();
frame3 =frame_thr.clone();
tm* now;
WaitForSingleObject(PhotoMutex, INFINITE);
frame1= frame_one.clone();
frame2= frame_two.clone();
frame3 =frame_thr.clone();
ReleaseMutex(PhotoMutex);
endTime1 = clock();
elasped = endTime1 - startTime1;
logger->info("camera load elapsed {}ms\n", elasped);
elasped = endTime1 - startTime1;
logger->info("camera load elapsed {}ms\n", elasped);
time(&nowTime); //获取系统当前时间戳
now = localtime(&nowTime); //将时间戳转化为时间结构体
_mkdir(wmphoto_path.c_str());
_mkdir(wmphoto_path.c_str());
if (saveRawImg) {
#if APPOINT_LIBRARY
string new_dir = wmphoto_path;
......@@ -1508,9 +1609,9 @@ cv::Mat getScaleBitmap(char* rawPath, char* cropPath, bool saveRawImg) {
char photoPath[MAX_PATH];
std::strcpy(photoPath, (wmphoto_path+"\\raw%d%d%d%d%d%d.jpg").c_str());
#endif // 0
sprintf(raw_pic_Name, photoPath, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday,
sprintf(raw_pic_Name, photoPath, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday,
now->tm_hour + 8, now->tm_min, now->tm_sec);
cv::imwrite(raw_pic_Name, frame1);
cv::imwrite(raw_pic_Name, frame1);
std::strcpy(rawPath, raw_pic_Name);
}
if (x && y && width && height) {
......@@ -1525,13 +1626,13 @@ cv::Mat getScaleBitmap(char* rawPath, char* cropPath, bool saveRawImg) {
sprintf(pic_Name, photoPath, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday,
now->tm_hour + 8, now->tm_min, now->tm_sec);
cv::Mat catImage1 = frame1(cv::Rect(x, y, width, height));
cv::Mat catImage2 = frame2(cv::Rect(x, y, width, height));
cv::Mat catImage2 = frame2(cv::Rect(x, y, width, height));
cv::Mat catImage3 = frame3(cv::Rect(x, y, width, height));
float f1 = TenengradBlurDetect(catImage1);
float f2 = TenengradBlurDetect(catImage2);
float f3 = TenengradBlurDetect(catImage3);
float maxF = max(max(f1, f2), f3);
float maxF = max(max(f1, f2), f3);
if (maxF == f1) {
returnFrame = catImage1.clone();
if (saveRawImg) {
......@@ -1565,11 +1666,11 @@ cv::Mat getScaleBitmap(char* rawPath, char* cropPath, bool saveRawImg) {
t.detach();
}
}
std::strcpy(cropPath, pic_Name);
std::strcpy(cropPath, pic_Name);
}
endTime1 = clock();//1计时开始
elasped = endTime1 - startTime1;
logger->info("camera all elapsed {}ms\n", elasped);
elasped = endTime1 - startTime1;
logger->info("camera all elapsed {}ms\n", elasped);
return returnFrame;
}
......@@ -1581,47 +1682,48 @@ void _stringCpy(string* des,string* rec,int len) {
}
// 主动识别接口
int MatDetect(Mat& imageFrame, char* productcodes, char* sessionId) {
int MatDetect(char* productcodes, char* sessionId) {
double all_start_time = clock();//1计时开始
if (!authed) {
authed = authorize();
if (!authed) {
cout << "验证失败" << endl;
return -1;
logger->info("验证失败");
return -2001;
};
}
if (!x && !y && !width && !height) {
logger->info("没有设置摄像头剪辑坐标");
return -2009;
}
int thread = 4;
int use_gpu = 0;
#if NCNN_VULKAN
// ncnn::create_gpu_instance();
#endif // NCNN_VULKAN
cv::Mat m = imageFrame.clone();
char rawPath[128];
char cropPath[128];
cv::Mat m = getScaleBitmap(rawPath, cropPath, false);
if (m.empty())
{
logger->info("cv::imread failed\n");
return -1;
return -2002;
}
int biggerNinety = 0;
// 拷贝图片地址
//strncpy(image, cropPath, 128);
string productcode[10];
std::vector<float> cls_scores;
float rhs[FEATURE_COUNT];
double start_time = ncnn::get_current_time();
detect_squeezenet(m, cls_scores, rhs);
std::thread t(compare_feature_faiss, rhs, productcode, ref(biggerNinety));
t.join();
int ret = detect_squeezenet(m, cls_scores, rhs);
double elasped = ncnn::get_current_time() - start_time;
logger->info("category elapsed {}ms\n", elasped);
compare_feature_faiss(rhs, productcode, ref(biggerNinety));
string newSessionId = get_session_id().c_str();
double save_record_start_time = clock();//1计时开始
string newSessionId = get_session_id();
std::strcpy(sessionId, newSessionId.c_str());
string imagePath = "WMPhoto\\" + newSessionId + ".jpg";
std::thread t3(saveImg, string(imagePath), m); //将Mat数据写入文件
t3.detach();
//param_in.detect_image_path = imagePath;
double save_record_start_time = clock();//1计时开始
// 组装返回的商品代码
char codes[10 * 10] = { };
for (int i = 0; i < 10; ++i)
......@@ -1633,7 +1735,12 @@ int MatDetect(Mat& imageFrame, char* productcodes, char* sessionId) {
}
logger->info("productcodes:{}", codes);
std::strcpy(productcodes, codes);
// 将图片向量进行逗号组装
string product_codes = productcodes;
char* realIds = const_cast<char*>(product_codes.c_str());
splitString(realIds, realProductCodes);
// 将图片向量进行逗号组装
char featureValue[FEATURE_COUNT * 10] = { };
for (int i = 0; i < FEATURE_COUNT; ++i)
{
......@@ -1649,10 +1756,34 @@ int MatDetect(Mat& imageFrame, char* productcodes, char* sessionId) {
sprintf(productIds + strlen(productIds), "%s,", productcode[i].c_str());
}
save_record(newSessionId, 0, 0, elasped, imagePath, string(featureValue), string(productIds), string(codes));
//判断是否识别到了空盘
float sim = calculSimilar(rhs, feature_empty, FEATURE_COUNT);
char rhs_data[FEATURE_COUNT * 10] = { };
for (int i = 0; i < FEATURE_COUNT; ++i)
{
sprintf(rhs_data + strlen(rhs_data), "%f,", feature_empty[i]);
}
logger->info("feature_empty feature:{}", rhs_data);
double save_record_end_time = clock();//1计时开始
for (int i = 0; i < FEATURE_COUNT; ++i)
{
sprintf(rhs_data + strlen(rhs_data), "%f,", rhs[i]);
}
logger->info("rhs feature:{}", rhs_data);
logger->info("相似度为 sim is{}", sim);
if (sim >= 0.95)
{
result.state = 2;
memset(productIds, '\0', sizeof(productIds));
}
logger->info("result.state is {}", result.state);
save_record(newSessionId, 0, 0, elasped, string(cropPath), string(featureValue), string(productIds), string(codes));
double save_record_end_time = clock();//1计时开始
logger->info("save record elapsed {}ms\n", save_record_end_time - save_record_start_time);
double all_end_time = clock();//1计时开始
logger->info("all time elapsed {}ms\n", all_start_time - all_end_time);
return 0;
}
......@@ -1762,79 +1893,85 @@ int WMAI_API DemoDetect(const char* imagePath, char* productcodes, char* session
// 零食识别
int doSnacksAutoDetect(char* productcodes, char* sessionId, char* image) {
double all_start_time = clock();//1计时开始
double all_start_time = clock();//1计时开始
if (!authed) {
authed = authorize();
authed = authorize();
if (!authed) {
logger->info("验证失败");
logger->info("验证失败");
return -2001;
};
}
if (!x && !y && !width && !height) {
logger->info("没有设置摄像头剪辑坐标");
logger->info("没有设置摄像头剪辑坐标");
return -2009;
}
int thread = 4;
int use_gpu = 0;
int thread = 4;
int use_gpu = 0;
#if NCNN_VULKAN
// ncnn::create_gpu_instance();
#endif // NCNN_VULKAN
char rawPath[128];
char cropPath[128];
cv::Mat m = getScaleBitmap(rawPath, cropPath, false);
char rawPath[128];
char cropPath[128];
cv::Mat m = getScaleBitmap(rawPath, cropPath, false);
if (m.empty())
{
logger->info("cv::imread failed\n");
logger->info("cv::imread failed\n");
return -2002;
}
int biggerNinety = 0;
int biggerNinety = 0;
// 拷贝图片地址
strncpy(image, cropPath, 128);
string productcode[10];
std::vector<float> cls_scores;
float rhs[FEATURE_COUNT];
double start_time = ncnn::get_current_time();
int ret = detect_squeezenet(m, cls_scores, rhs);
double elasped = ncnn::get_current_time() - start_time;
logger->info("category elapsed {}ms\n", elasped);
compare_feature_faiss(rhs, productcode, ref(biggerNinety));
double save_record_start_time = clock();//1计时开始
string newSessionId = get_session_id();
std::strcpy(sessionId, newSessionId.c_str());
strncpy(image, cropPath, 128);
string productcode[10];
std::vector<float> cls_scores;
float rhs[FEATURE_COUNT];
double start_time = ncnn::get_current_time();
int ret = detect_squeezenet(m, cls_scores, rhs);
double elasped = ncnn::get_current_time() - start_time;
logger->info("category elapsed {}ms\n", elasped);
compare_feature_faiss(rhs, productcode, ref(biggerNinety));
double save_record_start_time = clock();//1计时开始
string newSessionId = get_session_id();
std::strcpy(sessionId, newSessionId.c_str());
// 组装返回的商品代码
char codes[10 * 10] = { };
char codes[10 * 10] = { };
for (int i = 0; i < 10; ++i)
{
if (productcode[i].empty() || productcode[i] == "0") {
if (productcode[i].empty() || productcode[i] == "0") {
continue;
}
sprintf(codes + strlen(codes), "%s,", productcode[i].c_str());
sprintf(codes + strlen(codes), "%s,", productcode[i].c_str());
}
logger->info("productcodes:{}", codes);
logger->info("productcodes:{}", codes);
std::strcpy(productcodes, codes);
// 将图片向量进行逗号组装
char featureValue[FEATURE_COUNT * 10] = { };
for (int i = 0; i < FEATURE_COUNT; ++i)
{
string product_codes = productcodes;
char* realIds = const_cast<char*>(product_codes.c_str());
splitString(realIds, realProductCodes);
// 将图片向量进行逗号组装
char featureValue[FEATURE_COUNT * 10] = { };
for (int i = 0; i < FEATURE_COUNT; ++i)
{
sprintf(featureValue + strlen(featureValue), "%f,", rhs[i]);
}
// 组装productIds
char productIds[10 * 10] = { };
char productIds[10 * 10] = { };
for (int i = 0; i < 10; ++i)
{
if (productcode[i].empty()) {
continue;
}
sprintf(productIds + strlen(productIds), "%s,", productcode[i].c_str());
sprintf(productIds + strlen(productIds), "%s,", productcode[i].c_str());
}
save_record(newSessionId, 0, 0, elasped, string(cropPath), string(featureValue), string(productIds), string(codes));
double save_record_end_time = clock();//1计时开始
logger->info("save record elapsed {}ms\n", save_record_end_time - save_record_start_time);
double all_end_time = clock();//1计时开始
save_record(newSessionId, 0, 0, elasped, string(cropPath), string(featureValue), string(productIds), string(codes));
double save_record_end_time = clock();//1计时开始
logger->info("save record elapsed {}ms\n", save_record_end_time - save_record_start_time);
double all_end_time = clock();//1计时开始
logger->info("all time elapsed {}ms\n", all_start_time - all_end_time);
return 0;
}
......@@ -1843,8 +1980,8 @@ int doSnacksAutoDetect(char* productcodes, char* sessionId, char* image) {
int WMAI_API AutoDetect(char* productcodes, char* sessionId)
{
char image[128];
int ret = doSnacksAutoDetect(productcodes, sessionId, image);
char image[128];
int ret = doSnacksAutoDetect(productcodes, sessionId, image);
return ret;
}
......@@ -1940,7 +2077,7 @@ void saveDbIndex(CppSQLite3DB& db, const char* code, std::string& featureValue)
//覆盖删除值
CppSQLite3Buffer updateFeatureCode;
updateFeatureCode.format("update feature_code set code = %Q,feature= %Q,update_time = CURRENT_TIMESTAMP ,deleted = 0 where id = %d;", code, featureValue.c_str(), count);
updateFeatureCode.format("update feature_code set code = %Q,feature= %Q,update_time = datetime('now','localtime') ,deleted = 0 where id = %d;", code, featureValue.c_str(), count);
db.execDML(updateFeatureCode);
logger->info("覆盖成功");
......@@ -1973,7 +2110,7 @@ void saveDbIndex(CppSQLite3DB& db, const char* code, std::string& featureValue)
// 直接覆盖
CppSQLite3Buffer updateFeatureCode;
updateFeatureCode.format("update feature_code set feature = %Q,code = %Q,update_time = CURRENT_TIMESTAMP,deleted = 0 where id = %d", featureValue.c_str(), code, count);
updateFeatureCode.format("update feature_code set feature = %Q,code = %Q,update_time = datetime('now','localtime'),deleted = 0 where id = %d", featureValue.c_str(), code, count);
db.execDML(updateFeatureCode);
}
logger->info("count :{}", count);
......@@ -1990,17 +2127,17 @@ void saveDbIndex(CppSQLite3DB& db, const char* code, std::string& featureValue)
}
else {
// 记录feature 和 商品代码之间的关系 到sqlite 和 faiss索引
CppSQLite3Buffer insertFeatureCode; logger->info("LINE:%d", __LINE__);
insertFeatureCode.format("insert into feature_code(code, feature,update_time,deleted) values (%Q,%Q,CURRENT_TIMESTAMP,0);", code, featureValue.c_str()); logger->info("LINE:%d", __LINE__);
db.execDML(insertFeatureCode); logger->info("LINE:%d", __LINE__);
CppSQLite3Buffer insertFeatureCode;
insertFeatureCode.format("insert into feature_code(code, feature,update_time,deleted) values (%Q,%Q,datetime('now','localtime'),0);", code, featureValue.c_str());
db.execDML(insertFeatureCode);
int count = db.execScalar("select last_insert_rowid() from feature_code;"); logger->info("LINE:%d", __LINE__);
int count = db.execScalar("select last_insert_rowid() from feature_code;");
logger->info("db add id is {}", count);
//将数据加入索引
// 保存索引
//hnswExecutor->enqueue(saveHnswIndex, string(featureValue), count);
saveHnswIndex(string(featureValue), count); logger->info("LINE:%d", __LINE__);
saveHnswIndex(string(featureValue), count);
}
}
......@@ -2024,7 +2161,7 @@ void saveDbIndex2(CppSQLite3DB& db, const char* code, std::string& featureValue)
q.finalize();
// 直接覆盖
CppSQLite3Buffer updateFeatureCode;
updateFeatureCode.format("update feature_code set feature = %Q,code = %Q,update_time = CURRENT_TIMESTAMP where id = %d", featureValue.c_str(), code, id);
updateFeatureCode.format("update feature_code set feature = %Q,code = %Q,update_time = datetime('now','localtime') where id = %d", featureValue.c_str(), code, id);
db.execDML(updateFeatureCode);
// 保存索引
saveHnswIndex(string(featureValue), id);
......@@ -2032,7 +2169,7 @@ void saveDbIndex2(CppSQLite3DB& db, const char* code, std::string& featureValue)
else {
// 记录feature 和 商品代码之间的关系 到sqlite 和 faiss索引
CppSQLite3Buffer insertFeatureCode;
insertFeatureCode.format("insert into feature_code(code, feature,update_time) values (%Q,%Q,CURRENT_TIMESTAMP);", code, featureValue.c_str());
insertFeatureCode.format("insert into feature_code(code, feature,update_time) values (%Q,%Q,datetime('now','localtime'));", code, featureValue.c_str());
db.execDML(insertFeatureCode);
float features[FEATURE_COUNT];
......@@ -2173,7 +2310,7 @@ int doFruitsSetFeedBack(const char* code, char* sessionId, bool hit, char* produ
// 打标
markDown(code, db, modelCode, score);
//}
if (!hit) {
if (!hit|| !realProductCodes[1].empty()) {
saveDbIndex(db, code, featureValue);
sendClientFeatureMessage(code, featureValue);
}
......@@ -2186,7 +2323,7 @@ int doFruitsSetFeedBack(const char* code, char* sessionId, bool hit, char* produ
sprintf(uploadUrl, upload_file_url, dev.c_str(), tenantStr.c_str());
logger->info("upload url is {},imagePath is {}", uploadUrl, imagePath.c_str());
int curlCode = CommonTools::upload_file(uploadUrl, imagePath.c_str(), response);
logger->info("response is {},curl code is {}", response.c_str(), curlCode);
logger->info("response is {},curl code is {}", UTF_82ASCII(response), curlCode);
if (curlCode != 0) {
connectNet = false;
logger->info("设备未联网不再上传");
......@@ -2296,9 +2433,6 @@ int doSnacksSetFeedBack(const char* code, char* sessionId, bool hit, char* produ
logger->info("product_record not found , please check AutoDetect success");
return -2004;
}
CppSQLite3Buffer selectProductRecord;
selectProductRecord.format("select model_code,score,feature_value,image_path,product_ids,time,real_codes from product_record where session_id = %Q;", sessionId);
CppSQLite3Query q = db.execQuery(selectProductRecord);
int modelCode = 0;
float score;
string featureValue;
......@@ -2306,47 +2440,56 @@ int doSnacksSetFeedBack(const char* code, char* sessionId, bool hit, char* produ
string productIds;
string time;
string realCodes;
while (!q.eof())
{
modelCode = q.getIntField(0);
score = q.getFloatField(1);
featureValue = q.getStringField(2);
imagePath = q.getStringField(3);
productIds = q.getStringField(4);
time = q.getStringField(5);
realCodes = q.getStringField(6);
q.nextRow();
}
q.finalize();
if (featureValue.empty())
int realTopNo;
if (!hit|| !realProductCodes[1].empty())
{
return -2005;
};
// 获得topNo
string productCodes[10];
char* cIds = const_cast<char*>(productIds.c_str());
splitString(cIds, productCodes);
int topNo = getTopNo(productCodes, code);
CppSQLite3Buffer selectProductRecord;
selectProductRecord.format("select model_code,score,feature_value,image_path,product_ids,time,real_codes from product_record where session_id = %Q;", sessionId);
CppSQLite3Query q = db.execQuery(selectProductRecord);
while (!q.eof())
{
modelCode = q.getIntField(0);
score = q.getFloatField(1);
featureValue = q.getStringField(2);
imagePath = q.getStringField(3);
productIds = q.getStringField(4);
time = q.getStringField(5);
realCodes = q.getStringField(6);
q.nextRow();
}
q.finalize();
if (featureValue.empty())
{
return -2005;
};
string realProductCodes[10];
char* realIds = const_cast<char*>(realCodes.c_str());
splitString(realIds, realProductCodes);
int realTopNo = getTopNo(realProductCodes, code);
logger->info("sessionId is {},hit top {},real hit top is {}", sessionId, topNo, realTopNo);
// 获得topNo
string productCodes[10];
char* cIds = const_cast<char*>(productIds.c_str());
splitString(cIds, productCodes);
int topNo = getTopNo(productCodes, code);
saveDbIndex(db, code, featureValue);
sendClientFeatureMessage(code, featureValue);
string realProductCodes[10];
char* realIds = const_cast<char*>(realCodes.c_str());
splitString(realIds, realProductCodes);
realTopNo = getTopNo(realProductCodes, code);
logger->info("sessionId is {},hit top {},real hit top is {}", sessionId, topNo, realTopNo);
db.close();
saveDbIndex(db, code, featureValue);
sendClientFeatureMessage(code, featureValue);
db.close();
}
if (connectNet) {
Document d;
string response;
char uploadUrl[200];
sprintf(uploadUrl, upload_file_url, dev.c_str(), tenantStr.c_str());
logger->info("upload url is {},imagePath is {}", uploadUrl, imagePath.c_str());
logger->info("upload url is {},imagePath is {}", uploadUrl, (tool_get_dll_path()+imagePath).c_str());
int resultCode = CommonTools::upload_file(uploadUrl, imagePath.c_str(), response);
logger->info("code:{},response:{}", resultCode, UTF_82ASCII(response));
if (resultCode != 0) {
connectNet = false;
logger->info("设备未联网不再上传");
......@@ -2391,7 +2534,8 @@ int doSnacksSetFeedBack(const char* code, char* sessionId, bool hit, char* produ
// 保存未识别商品
int WMAI_API SetFeedBack(const char* code, char* sessionId, bool hit, char* productName)
{
logger->info("code is {} sessionId is {} hit is {} productName is {}", code, sessionId,hit, productName);
string name(productName);
logger->info("code is {} sessionId is {} hit is {} productName is {}", code, sessionId,hit, UTF_82ASCII(name));
logger->info("start feed back");
int result = doSnacksSetFeedBack(code, sessionId, hit, productName);
logger->info("end feed back");
......@@ -2410,7 +2554,7 @@ int checkTenant(char* tenant) {
sprintf(tenantUrl, query_tenant_url, dev.c_str(), tenant);
logger->info("tenantUrl is {}", tenantUrl);
CommonTools::HttpGet(tenantUrl, response2, 3);
logger->info("reponse is {}", response2.c_str());
logger->info("reponse is {}", UTF_82ASCII(response2));
d2.Parse(response2.c_str());
Value& s2 = d2["code"];
if (s2.GetInt() != 0) {
......@@ -2514,8 +2658,8 @@ int WMAI_API InitPos(char* tenant, char* posCode, char* snNo) {
}
}
// 注册pos机
int WMAI_API UnBindPos(char* tenant, char* snNo) {
// 解绑pos机
int WMAI_API UnbindPos(char* tenant, char* snNo) {
int checkTenantCode = checkTenant(tenant);
if (checkTenantCode != 0) {
return checkTenantCode;
......@@ -3042,7 +3186,36 @@ int WMAI_API WMrelease() {
}
int WMAI_API Close() {
logger->info("释放资源开始");
logger->info("开始释放资源");
CppSQLite3DB db;
db.open(gszFile);
int pre;
CppSQLite3Buffer selectvideocount;
selectvideocount.format("select count(*) from video_count");
CppSQLite3Query q = db.execQuery(selectvideocount);
while (!q.eof())
{
pre = q.getIntField(0);
break;
}
q.finalize();
if (pre == 0)
{
CppSQLite3Buffer insertvideocount;
insertvideocount.format("insert into video_count(count_in) values (%d);", rest_in);
db.execDML(insertvideocount);
}
else
{
CppSQLite3Buffer updatevideocount;
updatevideocount.format("update video_count set count_in=%d where id = 1", rest_in);
db.execDML(updatevideocount);
}
db.close();
if (cap.isOpened()) {
cap.release();
}
......@@ -3071,38 +3244,59 @@ int WMAI_API Close() {
int FoodInitParam(FOOD_PARAM_DATA* param_in)
{
_mkdir("data");
// step1:先配置下数据源
param_in->back_mat_path = "data/back.jpg";
param_in->debug_mode = false;
param_in->debug_mode = false;
// step2:配置roi
param_in->has_roi = true;
param_in->has_roi = true;
cv::Rect roi;
roi.x = ai_x;
roi.y = ai_y;
roi.width = ai_width;
roi.width = ai_width;
roi.height = ai_height;
param_in->roi = roi;
param_in->roi = roi;
//step4.裁剪下当前帧照片,保存当前图片
param_in->back =cv::imread(param_in->back_mat_path);
////获取空盘图向量
//RETRI_INPUT empty_img;
//empty_img.img = param_in->back.clone();
//RETRI_OUTPUT clsretri_output;
//int hr = RETRI_Process(empty_img, &clsretri_output, handle);
//if (hr != 0)
//{
// logger->info("元芒图形加速库推理失败!error code:{0:x}\n", hr);
// return -2008;
//}
//for (int i = 0; i < FEATURE_COUNT; i++)
//{
// feature_empty[i] = clsretri_output.feat[i];
//}
if (param_in->back.empty()) {
param_in->back = frame_pipe.clone();
param_in->back = frame_pipe.clone();
if (param_in->back.empty()) {
logger->info("图片是空的,\n");
return -2002;
}
if (roi.area() != 0)
{
param_in->back = param_in->back(roi);
}
char pathName[128] = {};
sprintf(pathName, "%s", param_in->back_mat_path.c_str());
logger->info("要保存的文件路径[{}]\n", pathName);
......@@ -3117,7 +3311,8 @@ int FoodInitParam(FOOD_PARAM_DATA* param_in)
param_in->debug_mode = debug;
libvideopipe::INIT_INFO video_pipe;
video_pipe.gpu_enable = drive_ai;
//video_pipe.gpu_enable = drive_ai;
video_pipe.gpu_enable =true;
video_pipe.lat3d_enable = true;
param_in->mvp = new libvideopipe::MotionVideoPipe;
param_in->mvp->Init(video_pipe);
......@@ -3205,37 +3400,167 @@ DWORD WINAPI FoodRealtimeCaptureImage(LPVOID params)
void trace_detect_process()
{
char rawPath[128];
char cropPath[128];
result.state = 1;
result.state = true;
Sleep(150);
cv::Mat m = getScaleBitmap(rawPath, cropPath,false);
if (m.empty())//获取图片失败编写日志
if (video_detect)
{
logger->info("cv::imread failed\n");
return;
char rawPath[128];
char cropPath[128];
Sleep(150);
//cv::Mat m = getScaleBitmap(rawPath, cropPath, false);
//if (m.empty())//获取图片失败编写日志
//{
// logger->info("cv::imread failed\n");
// return;
//}
//int ret = MatDetect(result.productCodes, result.sessionId);
int ret = AutoDetect(result.productCodes, result.sessionId);
if (ret != 0)
{
logger->info("Detect error:{}", ret);
return;
}
}
int ret = MatDetect(m, result.productCodes, result.sessionId);
if (ret != 0)
else
{
logger->info("Detect error:{}",ret);
return;
std::strcpy(result.productCodes, "");
std::strcpy(result.sessionId, "");
}
if (param_in.result_queue.size()< param_in.queue_max)
{
DETECT_RESULT tem = result;
param_in.result_queue.push(tem);
DETECT_RESULT tem = result;
param_in.result_queue.push(tem);
}
}
void trace_judge_process()
{
Sleep(100);
Sleep(100);
char path[128] = {};
char row_path[128] = {};
GetScaleBitmap(row_path, path);
param_in.detect_image_path = string(path);
char row_path[128] = {};
GetScaleBitmap(row_path, path);
param_in.detect_image_path = string(path);
}
void save_in_image()
{
if (rest_in > VIDEOCOINTIN)
{
return;
}
logger->info("rest_in is{}",rest_in);
std::string dir = "video_image_in";
std::string time = std::to_string(food_get_current_time_millis());
_mkdir(dir.c_str());
_mkdir((dir + "/" + time).c_str());
int i = 1;
const char* path = "%s/%s/%s-%d.jpg";
char name2[128] = {};
char name3[128] = {};
char name4[128] = {};
vector<string>res;
string pre1;
string pre2;
string pre3;
sprintf(name2, path, dir.c_str(), time.c_str(), time.c_str(), i++);
pre1 = pre1 + time.c_str() + "wmAce"+"-" + "1" + ".jpg";
res.push_back(pre1);
cv::imwrite(name2, param_in.back);
sprintf(name3, path, dir.c_str(), time.c_str(), time.c_str(), i++);
pre2 = pre2 + time.c_str() +"wmAce"+ "-" + "2" + ".jpg";
res.push_back(pre2);
cv::imwrite(name3, param_in.frame_out[3].img);
sprintf(name4, path, dir.c_str(), time.c_str(), time.c_str(), i++);
pre3 = pre3 + time.c_str() + "wmAce" + "-" + "3" + ".jpg";
res.push_back(pre3);
cv::imwrite(name4, param_in.frame_out[4].img);
char in[10] = "IN";
res.push_back(in);
Document d;
string response;
char uploadUrl[200];
string tenantStrs = "0";
sprintf(uploadUrl, upload_file1_url, dev.c_str(), tenantStrs.c_str());
logger->info("upload url is {}", uploadUrl);
int curlCode = CommonTools::upload_file1(uploadUrl,name2,name3,name4,res,response);
string rrr= UTF_82ASCII(response);
logger->info("response is {}",rrr);
if (curlCode != 0) {
logger->info("上传图片失败,退出");
return;
}
rest_in++;
}
void save_out_image()
{
if (rest_out > VIDEOCOINTIN)
{
return;
}
std::string dir = "video_image_out";
std::string time = std::to_string(food_get_current_time_millis());
_mkdir(dir.c_str());
_mkdir((dir + "/" + time).c_str());
int i = 1;
const char* path = "%s/%s/%s-%d.jpg";
char name5[128] = {};
char name6[128] = {};
char name7[128] = {};
vector<string>res1;
string buf1, buf2, buf3;
sprintf(name5, path, dir.c_str(), time.c_str(), time.c_str(), i++);
buf1 = buf1 + time.c_str() + "wmAce" + "-" + "1" + ".jpg";
res1.push_back(buf1);
cv::imwrite(name5, param_in.back);
sprintf(name6, path, dir.c_str(), time.c_str(), time.c_str(), i++);
buf2 = buf2 + time.c_str() + "wmAce" + "-" + "2"+".jpg";
res1.push_back(buf2);
cv::imwrite(name6, param_in.frame_out[3].img);
sprintf(name7, path, dir.c_str(), time.c_str(), time.c_str(), i++);
buf3 = buf3 + time.c_str() + "wmAce" + "-" + "3" + ".jpg";
res1.push_back(buf3);
cv::imwrite(name7, param_in.frame_out[4].img);
string out = "OUT";
res1.push_back(out);
Document d;
string response;
char uploadUrl[200];
string tenantStrs = "0";
sprintf(uploadUrl, upload_file1_url, dev.c_str(), tenantStrs.c_str());
logger->info("upload url is {}", uploadUrl);
int curlCode = CommonTools::upload_file1(uploadUrl, name5, name6, name7,res1, response);
string rrr = UTF_82ASCII(response);
logger->info("response is {}", rrr);
if (curlCode != 0) {
logger->info("上传图片失败,退出");
return;
}
rest_out++;
}
void video_trace_result_callback(const char* data, int len, void* user)
......@@ -3245,21 +3570,28 @@ void video_trace_result_callback(const char* data, int len, void* user)
if (output->status == libvideopipe::MOTION_STATUS_TYPES::MOTION_IN)
{
logger->info("检测到物品进入");
logger->info("检测到物品进入");
if (mode == FRESH_DETECT)
{
thread t(trace_detect_process);
t.detach();
thread t(trace_detect_process);
t.detach();
if (rest_count < VIDEOCOUNT)
{
thread t_(save_in_image);
t_.detach();
}
}
else if (mode == PREVENT_LOSS)
{
thread t(trace_judge_process);
t.detach();
thread t(trace_judge_process);
t.detach();
/*thread t_(save_in_image);
t_.detach();
logger->info("没有进行存图!");*/
if (param_in.result_queue.size() < param_in.queue_max)
{
DETECT_RESULT tem = result;
tem.state = true;
tem.state = 1;
param_in.result_queue.push(tem);
}
}
......@@ -3267,11 +3599,16 @@ void video_trace_result_callback(const char* data, int len, void* user)
if (output->status == libvideopipe::MOTION_STATUS_TYPES::MOTION_OUT)
{
logger->info("检测到物品离开");
if (rest_count < VIDEOCOUNT)
{
thread t_(save_out_image);
t_.detach();
}
if (param_in.result_queue.size() < param_in.queue_max)
{
DETECT_RESULT tem = result;
tem.state = false;
param_in.result_queue.push(tem);
DETECT_RESULT tem = result;
tem.state = 0;
param_in.result_queue.push(tem);
}
}
}
......@@ -3317,9 +3654,14 @@ DWORD WINAPI FoodDetectTrace(LPVOID params)
param_in->frame_in.pop(); // 删除一个原图
ReleaseMutex(param_in->hMutex);
param_in->frame_out.push_back(frame);
if (param_in->frame_out.size() > param_in->max_in_frame_queue)
{
param_in->frame_out.erase(param_in->frame_out.begin());
}
// step3:设置video input
libvideopipe::MOTION_VIDEOPIPE_INPUT video_input;
video_input.img = frame.img.clone();
video_input.pts = frame.timestamp;
......@@ -3331,6 +3673,7 @@ DWORD WINAPI FoodDetectTrace(LPVOID params)
imshow("frame.img", video_input.img);
cv::waitKey(1);
}
// step5:开始Trace;
//float _start = clock();
......@@ -3355,14 +3698,18 @@ void videoPipeDetect()
{
logger->info("videopipe init start");
FoodInitParam(&param_in);
// step1: 开线程测试
const int MAX_THREADS = 2;
HANDLE hThread[MAX_THREADS];
hThread[0] = CreateThread(NULL, 0, FoodRealtimeCaptureImage, &param_in, 0, NULL);
hThread[1] = CreateThread(NULL, 0, FoodDetectTrace, &param_in, 0, NULL);
param_in.hMutex = CreateMutex(NULL, FALSE, (LPCWSTR)"screen");
bool getthread = false;
// step2: Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
for (int i = 0; i < MAX_THREADS; i++)
......@@ -3377,7 +3724,7 @@ void videoPipeDetect()
}
//识别函数主控
int WMAI_API VideoPipeDetect() {
int WMAI_API VideopipeDetect() {
thread t(videoPipeDetect);
t.detach();
return 0;
......@@ -3482,14 +3829,33 @@ int WMAI_API ChangeBackPicture()
param_in.has_roi = true;
cv::Mat imgRoi = img(param_in.roi);
////更新空盘图的向量
//RETRI_INPUT empty_img;
//empty_img.img = imgRoi.clone();
//RETRI_OUTPUT clsretri_output;
//int hr = RETRI_Process(empty_img, &clsretri_output, handle);
//if (hr != 0)
//{
// logger->info("元芒图形加速库推理失败!error code:{0:x}\n", hr);
// return -2008;
//}
//for (int i = 0; i < FEATURE_COUNT; i++)
//{
// feature_empty[i] = clsretri_output.feat[i];
//}
char pathName[128] = {};
sprintf(pathName, "%s", param_in.back_mat_path.c_str());
cv::imwrite(pathName, imgRoi);
//step3.置换
param_in.back = imgRoi;
param_in.mvp->SetMarkMat(imgRoi);
logger->info("改变空盘图像结束");
//step4.上传图片
thread t(uploadImage);
t.detach();
......@@ -3632,19 +3998,23 @@ bool WMAI_API judgeScanTheCode()
return ret;
}
bool WMAI_API getVideopipeInit()
//bool WMAI_API getVideopipeInit()
//{
// return g_video_init;
//}
bool WMAI_API getInitResults()
{
return g_video_init;
}
bool WMAI_API ReturnCameraState()
bool WMAI_API returnCameraState()
{
return cap.isOpened();
}
//纠错
int WMAI_API FreshChangeError(const char* code)
int WMAI_API freshChangeError(const char* code)
{
......@@ -3715,8 +4085,12 @@ int WMAI_API FreshChangeError(const char* code)
{
//删除相似度高的数据
CppSQLite3Buffer deleted_sql;
deleted_sql.format("update feature_code set deleted = 1, update_time = CURRENT_TIMESTAMP where id = %d", number);
deleted_sql.format("update feature_code set deleted = 1, update_time = datetime('now','localtime') where id = %d", number);
db.execDML(deleted_sql);
//将删除的数据加入record_count表中
CppSQLite3Buffer insertrecord;
insertrecord.format("insert into record_count(count) values (%d)", number);
db.execDML(insertrecord);
idx->Removesample(f.second);
q.finalize();
}
......@@ -3836,3 +4210,10 @@ int WMAI_API SelectByName(char* name , char* code, char* image)
return 0;
}
int WMAI_API setVideoDetect(int ch)
{
video_detect = ch == 0 ? false : true;
return 0;
}
......@@ -126,7 +126,8 @@ extern "C" {
#endif
extern WMAI_EXPORT int WMAI_API Init();
extern WMAI_EXPORT int WMAI_API Init(char* path);
extern WMAI_EXPORT int WMAI_API RealTimeDetect(char* code , char* sessionId, bool &state );
......@@ -170,7 +171,7 @@ extern "C" {
/// 解绑pos机
/// </summary>
/// <returns>0:正常,非0:异常</returns>
extern WMAI_EXPORT int WMAI_API UnBindPos(char* tenant, char* snNo);
extern WMAI_EXPORT int WMAI_API UnbindPos(char* tenant, char* snNo);
/// <summary>
/// 设置开启摄像头序号
......@@ -245,7 +246,7 @@ extern "C" {
/// 视频流识别
/// </summary>
/// <returns>0:正常,非0:异常</returns>
extern WMAI_EXPORT int WMAI_API VideoPipeDetect();
extern WMAI_EXPORT int WMAI_API VideopipeDetect();
/// <summary>
/// 改变对比底图
......@@ -278,11 +279,13 @@ extern "C" {
extern WMAI_EXPORT bool WMAI_API judgeScanTheCode();
extern WMAI_EXPORT bool WMAI_API getVideopipeInit();
extern WMAI_EXPORT bool WMAI_API getInitResults();
extern WMAI_EXPORT bool WMAI_API returnCameraState();
extern WMAI_EXPORT bool WMAI_API ReturnCameraState();
extern WMAI_EXPORT int WMAI_API freshChangeError(const char* code);
extern WMAI_EXPORT int WMAI_API FreshChangeError(const char* code);
extern WMAI_EXPORT int WMAI_API setVideoDetect(int ch);
#ifdef __cplusplus
}
......
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -17,9 +17,9 @@ EXPORTS
Close @12
Test50000 @13
WMrelease @15
UnBindPos @17
UnbindPos @17
ClearTrainedData @18
VideoPipeDetect @19
VideopipeDetect @19
ChangeBackPicture @20
GetQueueSize @21
SelectByName @22
......@@ -31,6 +31,7 @@ EXPORTS
inputPluToDetect @28
getDetectImage @29
judgeScanTheCode @30
getVideopipeInit @31
ReturnCameraState @32
FreshChangeError @33
\ No newline at end of file
getInitResults @31
returnCameraState @32
freshChangeError @33
setVideoDetect @34
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment