Commit 7ca22226 张士柳

更新日志记录接口

1 个父辈 53a9dc28
......@@ -12,6 +12,7 @@ namespace eyemLib_Sharp
{
public unsafe class EyemLib
{
#region 枚举
//稳健估计方法
......@@ -648,6 +649,9 @@ namespace eyemLib_Sharp
//释放图像资源
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern void eyemImageFree(ref EyemImage tpImage);
// 设定日志回调
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern void setLogCallback(TCallBack cb);
//测试用
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
......@@ -778,6 +782,33 @@ namespace eyemLib_Sharp
private static extern int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, IntPtr tpArray, int iArraySize);
#endregion
// 日志回调
public delegate void TCallBack(string msg);
public static TCallBack sld = new TCallBack(TLogCallback);
public static event TCallBack OnNewLogCallback;
public static void TLogCallback(string msg)
{
OnNewLogCallback?.Invoke(msg);
}
public static void Init()
{
setLogCallback(sld);
OnNewLogCallback += new TCallBack(EyemLib_OnNewLogCallback);
}
private static void EyemLib_OnNewLogCallback(string msg)
{
Console.WriteLine(msg);
}
public static void Free()
{
setLogCallback(null); sld = null;
}
public static void eyemReadImageTool(string fileName)
{
......@@ -975,8 +1006,8 @@ namespace eyemLib_Sharp
tpRoi2.iWidth = 28;
tpRoi2.iHeight = 9;
double matchDeg = 0.80;
flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//double matchDeg = 0.80;
//flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//加载模板到内存
IntPtr hModelID = IntPtr.Zero;
......
......@@ -10,11 +10,14 @@ namespace eyemLib_Sharp
{
static void Main(string[] args)
{
//初始化
EyemLib.Init();
string[] fileNames = Directory.GetFiles(@"D:\批量测试图像\", "*.*", SearchOption.AllDirectories);
//for (int j = 0; j < 250; j++)
//{
// ParallelOptions po = new ParallelOptions();
// po.MaxDegreeOfParallelism = 3;
// po.MaxDegreeOfParallelism = 2;
// Parallel.ForEach(fileNames, po, fn =>
// {
// EyemLib.eyemReadImageTool(fn);
......@@ -23,16 +26,16 @@ namespace eyemLib_Sharp
//}
//EyemLib.eyemTest2(fileNames);
//foreach (var item in fileNames)
//{
// EyemLib.eyemReadImageTool(item);
//}
for (int i = 0; i < 1; i++)
foreach (var item in fileNames)
{
EyemLib.eyemTestVideoCapture("D:\\插件完成检测\\视频\\cap5.mp4");
EyemLib.eyemReadImageTool(item);
}
//for (int i = 0; i < 1; i++)
//{
// EyemLib.eyemTestVideoCapture("D:\\插件完成检测\\视频\\cap5.mp4");
//}
//IntPtr hModelID;
//EyemLib.eyemInitModelE(out hModelID);
......@@ -61,6 +64,8 @@ namespace eyemLib_Sharp
//EyemLib.eyemReleaseModelE(ref hModelID);
EyemLib.Free();
Console.Write("请按任意键继续。。。");
Console.ReadKey();
}
......
#pragma once
//
// eyemEdgeͷ
// eyemGenericͷ
//
#ifndef __EYEM_GENERIC_H
#define __EYEM_GENERIC_H
......
#include "eyemLib.h"
int main()
TCallback g_logger_cb = NULL;
void Logger::t(const std::string & msg)
{
std::string message(prefix_);
message += msg;
if (g_logger_cb) g_logger_cb(message.c_str());
}
// 趨־
void setLogCallback(TCallback cb)
{
if (!g_logger_cb)
{
g_logger_cb = cb;
}
}
void main()
{
char* filename = "D:\\Matlabͼ\\circle_plate_04.png";
cv::Mat src = cv::imread(filename, cv::IMREAD_UNCHANGED);
//EyemImage tpImage;
//tpImage.iHeight = src.rows;
//tpImage.iWidth = src.cols;
//tpImage.ucpImage = src.data;
//EyemRect tpRoi;
//tpRoi.iXs = 0;
//tpRoi.iYs = 0;
//tpRoi.iWidth = src.cols;
//tpRoi.iHeight = src.rows;
//int blobNum;
//IntPtr intptr;
//EyemBinBlob *blobs;
//eyemBinBlob(tpImage, tpRoi, 120, EYEM_BIN_WHITE, 1200, &intptr, &blobs, &blobNum);
////must be dispose
//eyemBinFree(intptr);
return 0;
if (src.empty()) {
return;
}
return;
}
\ No newline at end of file
......@@ -17,6 +17,7 @@
#define MAKETYPE CV_MAKETYPE
#endif
/********************************************************************************************/
/* 通用标头 */
/********************************************************************************************/
......@@ -864,4 +865,20 @@ extern "C" {
#endif
// 日志回调定义
typedef void(__stdcall*TCallback)(const char* msg);
class Logger
{
public:
Logger(const std::string prefix = "") : prefix_(prefix) {}
public:
void t(const std::string& msg);
private:
std::string prefix_;
};
extern "C" __declspec(dllexport) void setLogCallback(TCallback cb);
#endif/* __EYEM_LIB_H */
此文件类型无法预览
......@@ -271,14 +271,19 @@ trackMat 输入文件名
*/
static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Point &pt, double &dMatchDeg)
{
std::string logModule = "";
logModule += __func__;
struct stat _Stat;
if (stat(fileName, &_Stat) != 0)
return;
//上锁
logger.t("[" + logModule + "]" + "上锁...");
mtx_misc.lock();
logger.t("[" + logModule + "]" + "打开文件...");
FILE *fps = NULL;
fopen_s(&fps, fileName, "r");
......@@ -299,15 +304,19 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
memset(_Data, 0, _Size);
//读取数据
logger.t("[" + logModule + "]" + "读取数据...");
fread(_Data, sizeof(uint8_t), _Size, fps);
//关闭文件
logger.t("[" + logModule + "]" + "关闭文件...");
fclose(fps);
//解锁
logger.t("[" + logModule + "]" + "解锁...");
mtx_misc.unlock();
//获取图像数据大小
logger.t("[" + logModule + "]" + "拷贝头数据...");
unsigned char _SizeData[8];
memcpy(_SizeData, _Data, 8);
......@@ -318,27 +327,33 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
const int tplSize = _Size - valSize - 8;
//拷贝文件信息
logger.t("[" + logModule + "]" + "拷贝文件信息...");
char *tplInfo = new char[tplSize];
memcpy(tplInfo, _Data + valSize + 8, tplSize);
//获取文件信息
logger.t("[" + logModule + "]" + "分割字符串...");
std::string line(tplInfo);
std::vector<std::string> hints;
split(line, ",", hints);
//宽,高,坐标,匹配度
logger.t("[" + logModule + "]" + "类型转换...");
int X = std::atoi(hints[2].c_str()), Y = std::atoi(hints[3].c_str());
dMatchDeg = std::atof(hints[4].substr(0, 4).c_str()); pt = cv::Point(std::atoi(hints[0].c_str()), std::atoi(hints[1].c_str()));
//创建图像文件
logger.t("[" + logModule + "]" + "创建图像...");
tplMat.create(Y, X, CV_8UC1, -1, true);
//拷贝数据
logger.t("[" + logModule + "]" + "拷贝图像数据...");
cv::Mat _tplMat = tplMat.getMat();
memcpy(_tplMat.data, _Data + 8, valSize);
//释放内存
logger.t("[" + logModule + "]" + "释放内存...");
delete[] tplInfo;
tplInfo = NULL;
......@@ -450,7 +465,7 @@ static double getThreshVal_Otsu_8u(const cv::Mat& _src)
size.width *= size.height;
size.height = 1;
step = size.width;
}
}
#ifdef HAVE_IPP
unsigned char thresh = 0;
......@@ -4690,7 +4705,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
}
}
#endif
......@@ -4749,170 +4764,170 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
trackEnd = (!found);
} while (!trackEnd);
} while (!trackEnd);
}
}
#if OPTIMIZE_ON
,
[&]
[&]
#endif
{
///< 逆时针追踪
//追踪起点
cv::Point2f trackCenter(startCenter.x, startCenter.y);
//起始扫描角度、半径
double trackAngle = startAngle, trackRadius = startRadius;
//元件本身角度
double trackOffset = dOffset;
//元件间间距
double partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//外接矩形
cv::Point2f pts[4];
//开始追踪
bool trackEnd = true;
//
do
{
///< 逆时针追踪
//追踪起点
cv::Point2f trackCenter(startCenter.x, startCenter.y);
//起始扫描角度、半径
double trackAngle = startAngle, trackRadius = startRadius;
//元件本身角度
double trackOffset = dOffset;
//元件间间距
double partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//外接矩形
cv::Point2f pts[4];
//开始追踪
bool trackEnd = true;
//
do
bool found = true;
std::vector<Track> vParts;
for (double t = trackAngle - (trackOffset / 3.0 + partDist + trackOffset / 2.0); t > trackAngle - \
(trackOffset / 3.0 + partDist + trackOffset / 2.0) - trackOffset / 3.0; t -= dMinorStep)
{
bool found = true;
std::vector<Track> vParts;
for (double t = trackAngle - (trackOffset / 3.0 + partDist + trackOffset / 2.0); t > trackAngle - \
(trackOffset / 3.0 + partDist + trackOffset / 2.0) - trackOffset / 3.0; t -= dMinorStep)
{
trackCenter.x = float(reelCenter.x + trackRadius*cos(t*c));
trackCenter.y = float(reelCenter.y + trackRadius*sin(t*c));
//计算旋转矩形
calcRotateRect(trackCenter, (float)t, (float)trackLength, (float)trackWidth, pts);
trackCenter.x = float(reelCenter.x + trackRadius*cos(t*c));
trackCenter.y = float(reelCenter.y + trackRadius*sin(t*c));
//模板匹配
double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backT), false, maxyyu, maxyyuloc, cv::noArray());
//计算旋转矩形
calcRotateRect(trackCenter, (float)t, (float)trackLength, (float)trackWidth, pts);
//最小匹配结果
if (maxyyu > 0.15) {
//存放结果
vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
}
//模板匹配
double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backT), false, maxyyu, maxyyuloc, cv::noArray());
//测试标记
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
//最小匹配结果
if (maxyyu > 0.15) {
//存放结果
vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
}
if (vParts.size() == 0)
break;
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
//测试标记
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
}
if (vParts.size() == 0)
break;
//理论元件区域
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//理论元件区域
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
//模板匹配/更新元件精确位置+判断
double maxyyu;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backT), false, maxyyu, trackCenter, cv::noArray());
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//
bool trayEnd = false;
if (true) {
//考虑增加[-2,2]角度范围以应对料盘变形
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backT), true, maxyyu, trackCenter, binary);
}
//模板匹配/更新元件精确位置+判断
double maxyyu;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backT), false, maxyyu, trackCenter, cv::noArray());
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
// std::cout << "xx" << std::endl;
//}
//
bool trayEnd = false;
if (true) {
//考虑增加[-2,2]角度范围以应对料盘变形
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backT), true, maxyyu, trackCenter, binary);
}
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
// std::cout << "xx" << std::endl;
//}
//计算实际元件位置
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算实际元件位置
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
#ifdef _DEBUG
cv::Point2f ptsT[4];
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT);
cv::Point2f ptsT[4];
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT);
if (!trayEnd)
if (!trayEnd)
{
//画出元件区域
for (int j = 0; j < 4; j++)
{
//画出元件区域
for (int j = 0; j < 4; j++)
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
}
#endif
//判断是否追踪终止
if (trayEnd)
{
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenterT.y))[cvRound(trackCenterT.x)] == 255) {
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断是否追踪终止
if (trayEnd)
{
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenterT.y))[cvRound(trackCenterT.x)] == 255) {
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter = trackCenterT;
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter = trackCenterT;
///<更新追踪信息
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
///<更新追踪信息
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算理论元件位置
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//计算理论元件位置
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记计数
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//标记计数
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//标记当前位置
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
else
{
//标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记当前位置
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
else
{
//标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记计数
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//标记计数
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//标记当前位置
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
//标记当前位置
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
trackEnd = (!found);
} while (!trackEnd);
trackEnd = (!found);
} while (!trackEnd);
}
#if OPTIMIZE_ON
);
);
#endif
}
......@@ -5095,10 +5110,14 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, double dMinScore,
int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
{
std::string logModule = "";
logModule += __func__;
logger.t("[" + logModule + "]" + "初始化模板...");
//获取文件路径
std::vector<std::string> fileNames;
cv::glob(ccTplName, fileNames);
logger.t("[" + logModule + "]" + "获取文件名...");
//判断文件
if (fileNames.size() <= 0)
return FUNC_CANNOT_CALC;
......@@ -5112,10 +5131,11 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
cv::Mat tplMat; double matchDeg;
try
{
logger.t("[" + logModule + "]" + "根据文件名加载模板...");
loadTrackModel(fileName.c_str(), tplMat, cv::Point(), matchDeg);
}
catch (...) {
logger.t("[" + logModule + "]" + "加载模板异常...");
return FUNC_CANNOT_CALC;
}
......@@ -5130,12 +5150,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
int _Size = tplMat.cols*tplMat.rows * sizeof(unsigned char);
//数据
logger.t("[" + logModule + "]" + "分配模板图像内存...");
modelID.vpImage = (unsigned char *)malloc(_Size);
if (NULL == modelID.vpImage)
return FUNC_NOT_ENOUGH_MEM;
//拷贝数据
logger.t("[" + logModule + "]" + "拷贝模板数据...");
memcpy(modelID.vpImage, _tplMat.data, _Size);
//位置
......@@ -5148,6 +5170,7 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
modelID.dMatchDeg = matchDeg;
//名称?会导致内存泄露吗
logger.t("[" + logModule + "]" + "分配模板文件名内存...");
modelID.lpszName = (char *)CoTaskMemAlloc(128);
if (NULL != modelID.lpszName)
{
......@@ -5157,7 +5180,8 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
}
else return FUNC_NOT_ENOUGH_MEM;
//压入堆栈
//压入容器
logger.t("[" + logModule + "]" + "将模板压入容器...");
tpModelID->push_back(modelID);
}
}
......@@ -5578,9 +5602,9 @@ int eyemTrackFeature(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois,
}
}
cv::imshow("eyemLib", showMat);
//cv::imshow("eyemLib", showMat);
cv::waitKey(1);
//cv::waitKey(1);
///<输出结果图像
{
......
......@@ -16,5 +16,7 @@ constexpr double c = PI / 180.;
std::mutex mtx_misc;
Logger logger;
#endif/* __EYEM_MISC_H */
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!