Commit 5d801ec0 张士柳

1 个父辈 5fb7556d
......@@ -780,6 +780,9 @@ namespace eyemLib_Sharp
//插件机
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, IntPtr tpArray, int iArraySize);
//跳过程序执行
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int setSkipProcessID(int pid);
#endregion
#region 日志功能
......@@ -794,8 +797,12 @@ namespace eyemLib_Sharp
OnNewLogCallback?.Invoke(msg);
}
public static log4cpp.LogManager logcpp = null;
public static void Init()
{
logcpp = new log4cpp.LogManager("D:\\日志\\", "_运行日志", log4cpp.GenerateMode.ByEveryDay);
setLogCallback(sld);
OnNewLogCallback += new TCallBack(EyemLib_OnNewLogCallback);
......@@ -809,7 +816,13 @@ namespace eyemLib_Sharp
//记录日志
private static void EyemLib_OnNewLogCallback(string msg)
{
Console.WriteLine(msg);
logcpp.WriteLog("[" + Thread.CurrentThread.ManagedThreadId.ToString("X16") + "]" + msg);
}
//设置跳过程序执行
public static void setSkipProcess(int pid)
{
setSkipProcessID(pid);
}
#endregion
......@@ -1024,9 +1037,17 @@ namespace eyemLib_Sharp
//插入模板
flag = eyemInsertModel(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
string[] tpModels = selectModel.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (tpModels.Length <= 0)
{
logcpp.WriteLog("选择模板少于0");
return;
}
//根据名称获取模板
EyemModelID tpModelID = new EyemModelID();
eyemAchvModelByName(selectModel.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[0], hModelID, ref tpModelID);
eyemAchvModelByName(tpModels[0], hModelID, ref tpModelID);
//EyemImage tpModeImg = new EyemImage();
//tpModeImg.iChannels = 1; tpModeImg.iDepth = 0;
......@@ -1046,7 +1067,7 @@ namespace eyemLib_Sharp
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), 35, 0, 100, 5, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), 0.1, "IP_LARGE_PARTS", 100, 7, ref pNumObj, out tpDstImg);
//eyemCountObjectE(image, tpRoi, fileName, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), selectModel.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[0], hModelID, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), tpModels[0], hModelID, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + /*file.Replace(".png", ".tpl")*/"74d571ed-9fd4-4959-85dd-3195261e4b48.tpl", ref pNumObj, out tpDstImg);
//移除模板
......
......@@ -10,27 +10,32 @@ namespace eyemLib_Sharp
{
static void Main(string[] args)
{
DirectoryInfo di = new DirectoryInfo("D:\\日志\\");
if (!di.Exists)
{
di.Create();
}
//初始化
EyemLib.Init();
string[] fileNames = Directory.GetFiles(@"D:\批量测试图像\", "*.*", SearchOption.AllDirectories);
//for (int j = 0; j < 250; j++)
//{
// ParallelOptions po = new ParallelOptions();
// po.MaxDegreeOfParallelism = 2;
// Parallel.ForEach(fileNames, po, fn =>
// {
// EyemLib.eyemReadImageTool(fn);
// });
// Console.Write("请按任意键继续。。。");
//}
//EyemLib.eyemTest2(fileNames);
foreach (var item in fileNames)
for (int j = 0; j < 1250; j++)
{
EyemLib.eyemReadImageTool(item);
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 1;
Parallel.ForEach(fileNames, po, fn =>
{
EyemLib.eyemReadImageTool(fn);
});
Console.Write("请按任意键继续。。。");
}
//foreach (var item in fileNames)
//{
// EyemLib.eyemReadImageTool(item);
//}
//for (int i = 0; i < 1; i++)
//{
// EyemLib.eyemTestVideoCapture("D:\\插件完成检测\\视频\\cap5.mp4");
......
......@@ -50,6 +50,9 @@
<ItemGroup>
<Compile Include="EyemLib.cs" />
<Compile Include="EyemLibDemo.cs" />
<Compile Include="log4cpp\ILog4CPP.cs" />
<Compile Include="log4cpp\Log4CPPBase.cs" />
<Compile Include="log4cpp\LogManager.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
......
#define HAS_READERWRITELOCK
using System;
using System.Threading;
namespace eyemLib_Sharp.log4cpp
{
interface ILog4CPP
{
/// <summary>
/// 记录日志
/// </summary>
/// <param name="text">日志内容</param>
void WriteLog(string text);
string[] GetExistLogFileNames();
}
/// <summary>
/// 生成日志模式
/// </summary>
public enum GenerateMode
{
/// <summary>
/// 按每分钟生成日志文件
/// </summary>
ByEveryMinitues = 0,
/// <summary>
/// 按每个小时生成日志文件
/// </summary>
ByEveryHour = 1,
/// <summary>
/// 按每天生成日志文件
/// </summary>
ByEveryDay = 2,
}
public enum CreateFileMode
{
/// <summary>
/// 生成.csv文件
/// </summary>
CSV,
/// <summary>
/// 生成.txt文件
/// </summary>
TXT
}
public sealed class ReaderWriteLock
{
public ReaderWriteLock()
{
m_lock = new System.Threading.ReaderWriterLock();
}
public void EnterReaderLock()
{
#if HAS_READERWRITELOCK
m_lock.AcquireReaderLock(-1);
#else
System.Threading.Monitor.Enter(this);
#endif
}
public void ReleaseReaderLock()
{
#if HAS_READERWRITELOCK
m_lock.ReleaseReaderLock();
#else
System.Threading.Monitor.Exit(this);
#endif
}
public void EnterWriterLock()
{
#if HAS_READERWRITELOCK
m_lock.AcquireWriterLock(-1);
#else
System.Threading.Monitor.Enter(this);
#endif
}
public void ReleaseWriterLock()
{
#if HAS_READERWRITELOCK
m_lock.ReleaseWriterLock();
#else
System.Threading.Monitor.Exit(this);
#endif
}
#if HAS_READERWRITELOCK
private System.Threading.ReaderWriterLock m_lock;
#endif
}
}
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Text;
using System.Threading;
namespace eyemLib_Sharp.log4cpp
{
public abstract class Log4CPPBase : IDisposable
{
public Log4CPPBase()
{
m_FileLock = new ReaderWriteLock();
m_vec4Write = new ConcurrentQueue<string>();
ThreadPool.QueueUserWorkItem(new WaitCallback(Write), null);
}
private ReaderWriteLock m_FileLock;//文件锁
private ConcurrentQueue<string> m_vec4Write;
private CreateFileMode m_fileMode;
private int m_WriteStatus = 0;
//添加日志
public void WriteLog(string text)
{
m_vec4Write.Enqueue(text);
}
//写日志
private void Write(object obj)
{
while (true)
{
if (m_vec4Write.Count > 0)
{
string text = "";
m_vec4Write.TryDequeue(out text);
if (Interlocked.CompareExchange(ref m_WriteStatus, 1, 0) == 0)
{
WriteLogToFile(text);
}
}
Thread.Sleep(1);
}
}
protected virtual string GetLogFilePath()
{
return string.Empty;
}
private void WriteLogToFile(string text)
{
try
{
//进入文件锁
m_FileLock.EnterWriterLock();
//获取文件名
string logFullPath = GetLogFilePath();
if (!string.IsNullOrEmpty(logFullPath))
{
StreamWriter sw = null;
try
{
sw = new StreamWriter(logFullPath, true, Encoding.UTF8);
if (text != null)
{
sw.WriteLine(text);
sw.Flush();
}
}
catch (Exception) { }
finally
{
if (sw != null)
{
sw.Close();
sw.Dispose();
sw = null;
}
m_FileLock.ReleaseWriterLock();
}
}
}
catch (Exception) { }
finally
{
Interlocked.Exchange(ref m_WriteStatus, 0);
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);//防止Finalize调用
}
private bool m_disposed = false;//标识资源是否被释放过
protected virtual void Dispose(bool disposing)
{
if (!m_disposed)
{
if (disposing)
{
//释放托管资源
if (m_FileLock != null)
{
m_FileLock = null;
}
}
//释放非托管资源
m_disposed = true;
}
}
~Log4CPPBase()
{
Dispose(false);
}
}
}
using System;
namespace eyemLib_Sharp.log4cpp
{
public class LogManager : Log4CPPBase, ILog4CPP
{
public LogManager(string filepath, string filename, GenerateMode generateMode = GenerateMode.ByEveryHour)
{
m_filePath = filepath;
m_fileName = filename;
m_generateMode = generateMode;
}
/// <summary>
/// 文件的路径
/// </summary>
private string m_filePath = string.Empty;
/// <summary>
/// 文件名称
/// </summary>
private string m_fileName = string.Empty;
private GenerateMode m_generateMode = GenerateMode.ByEveryHour;
protected override string GetLogFilePath()
{
if (string.IsNullOrEmpty(m_filePath)) return string.Empty;
switch (m_generateMode)
{
case GenerateMode.ByEveryMinitues:
return m_filePath + DateTime.Now.ToString("yyyy年MM月dd日HH时mm分") + m_fileName + ".txt";
case GenerateMode.ByEveryHour:
return m_filePath + DateTime.Now.ToString("yyyy年MM月dd日HH时") + m_fileName + ".txt";
case GenerateMode.ByEveryDay:
return m_filePath + DateTime.Now.ToString("yyyy年MM月dd日") + m_fileName + ".txt";
default: return string.Empty;
}
}
public string[] GetExistLogFileNames()
{
if (!string.IsNullOrEmpty(m_filePath))
{
return System.IO.Directory.GetFiles(m_filePath, "*.txt");
}
else
{
return new string[] { };
}
}
}
}
......@@ -18,15 +18,43 @@ void setLogCallback(TCallback cb)
}
}
int killProcessID = -1;
void main()
void setSkipProcessID(int pid)
{
killProcessID = pid;
}
static char *get_option()
{
return NULL;
}
Logger logger;
int main(int argc, char **argv)
{
char* filename = "D:\\Matlab测试图像\\circle_plate_04.png";
cv::Mat src = cv::imread(filename, cv::IMREAD_UNCHANGED);
if (src.empty()) {
return;
logger.t("图像文件不存在!");
return 0;
}
return;
EyemRect tpRoi;
tpRoi.iXs = tpRoi.iYs = 50;
tpRoi.iWidth = src.cols; tpRoi.iHeight = src.rows;
EyemImage image;
image.iChannels = src.channels(); image.iDepth = 0; image.iHeight = src.rows; image.iWidth = src.cols; image.vpImage = src.data;
//获取结果图像
EyemImage tpDstImg;
int flag = eyemAchvTemplateImage(image, tpRoi, &tpDstImg);
//加载模板
IntPtr tpModelID = NULL;
eyemInitModel("D:\\模板文件", &tpModelID);
return 0;
}
\ No newline at end of file
......@@ -864,6 +864,9 @@ extern "C" {
}
#endif
//跳过某接口执行
extern "C" __declspec(dllexport) void setSkipProcessID(int pid);
// 日志回调定义
typedef void(__stdcall*TCallback)(const char* msg);
......
此文件类型无法预览
......@@ -269,21 +269,23 @@ static void split(const std::string &cStrText, const std::string &cStrDelim, std
/** 载入模板
trackMat 输入文件名
*/
static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Point &pt, double &dMatchDeg)
static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Point &pt, double &dMatchDeg, const char *callFunc = "")
{
std::string logModule = "";
std::string logModule = std::string(callFunc) + "->";
logModule += __func__;
logModule += "(" + std::to_string(*(uint32_t *)(&std::this_thread::get_id())) + "):";
struct stat _Stat;
if (stat(fileName, &_Stat) != 0)
return;
//上锁
logger.t("[" + logModule + "]" + "上锁...");
logger.t(logModule + "上锁...");
mtx_misc.lock();
logger.t("[" + logModule + "]" + "打开文件...");
logger.t(logModule + "打开文件...");
FILE *fps = NULL;
fopen_s(&fps, fileName, "r");
......@@ -304,19 +306,19 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
memset(_Data, 0, _Size);
//读取数据
logger.t("[" + logModule + "]" + "读取数据...");
logger.t(logModule + "读取二进制数据...");
fread(_Data, sizeof(uint8_t), _Size, fps);
//关闭文件
logger.t("[" + logModule + "]" + "关闭文件...");
logger.t(logModule + "关闭文件...");
fclose(fps);
//解锁
logger.t("[" + logModule + "]" + "解锁...");
logger.t(logModule + "解锁...");
mtx_misc.unlock();
//获取图像数据大小
logger.t("[" + logModule + "]" + "拷贝头数据...");
logger.t(logModule + "拷贝头数据...");
unsigned char _SizeData[8];
memcpy(_SizeData, _Data, 8);
......@@ -327,33 +329,33 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
const int tplSize = _Size - valSize - 8;
//拷贝文件信息
logger.t("[" + logModule + "]" + "拷贝文件信息...");
logger.t(logModule + "拷贝文件信息...");
char *tplInfo = new char[tplSize];
memcpy(tplInfo, _Data + valSize + 8, tplSize);
//获取文件信息
logger.t("[" + logModule + "]" + "分割字符串...");
logger.t(logModule + "分割字符串...");
std::string line(tplInfo);
std::vector<std::string> hints;
split(line, ",", hints);
//宽,高,坐标,匹配度
logger.t("[" + logModule + "]" + "类型转换...");
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 + "]" + "创建图像...");
logger.t(logModule + "创建模板图像...");
tplMat.create(Y, X, CV_8UC1, -1, true);
//拷贝数据
logger.t("[" + logModule + "]" + "拷贝图像数据...");
logger.t(logModule + "拷贝图像数据...");
cv::Mat _tplMat = tplMat.getMat();
memcpy(_tplMat.data, _Data + 8, valSize);
//释放内存
logger.t("[" + logModule + "]" + "释放内存...");
logger.t(logModule + "释放内存...");
delete[] tplInfo;
tplInfo = NULL;
......@@ -465,7 +467,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;
......@@ -659,6 +661,12 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 初始阶段被跳过执行...");
return FUNC_CANNOT_CALC;
}
//图像裁剪
src = src(cv::Rect(tpRoi.iXs, tpRoi.iYs, tpRoi.iWidth, tpRoi.iHeight)).clone();
......@@ -1098,6 +1106,12 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do
{
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
......@@ -1376,6 +1390,13 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -1549,6 +1570,13 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -1628,6 +1656,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 初始阶段被跳过执行...");
return FUNC_CANNOT_CALC;
}
//图像裁剪
src = src(cv::Rect(tpRoi.iXs, tpRoi.iYs, tpRoi.iWidth, tpRoi.iHeight)).clone();
......@@ -1953,6 +1987,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do
{
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
......@@ -2230,6 +2270,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -2403,6 +2450,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -2605,6 +2659,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do
{
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
......@@ -2882,6 +2942,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -3055,6 +3122,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -3163,6 +3237,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 初始阶段被跳过执行...");
return FUNC_CANNOT_CALC;
}
//图像裁剪
src = src(cv::Rect(tpRoi.iXs, tpRoi.iYs, tpRoi.iWidth, tpRoi.iHeight)).clone();
......@@ -3602,6 +3682,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do
{
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
......@@ -3880,6 +3966,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -4053,6 +4145,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
}
}
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -4136,6 +4234,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
if (src.empty() || NULL == hModelID) {
return FUNC_IMAGE_NOT_EXIST;
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 初始阶段被跳过执行...");
return FUNC_CANNOT_CALC;
}
double begin0 = (double)cv::getTickCount();
//转单通道图像
......@@ -4544,6 +4649,12 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
///<开始顺时针与逆时针两个方向追踪流程
for (std::vector<cv::Point>::iterator itv = matchPts.begin(); itv != matchPts.end(); ++itv)
{
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//追踪起点
cv::Point2f startCenter((float)(*itv).x, (float)(*itv).y);
......@@ -4761,6 +4872,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
trackEnd = (!found);
......@@ -4923,6 +5039,12 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found);
} while (!trackEnd);
}
......@@ -5113,11 +5235,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
std::string logModule = "";
logModule += __func__;
logger.t("[" + logModule + "]" + "初始化模板...");
logModule += "(" + std::to_string(*(uint32_t *)(&std::this_thread::get_id())) + "):";
logger.t(logModule + "初始化模板...");
//获取文件路径
std::vector<std::string> fileNames;
cv::glob(ccTplName, fileNames);
logger.t("[" + logModule + "]" + "获取文件名...");
logger.t(logModule + "获取文件名...");
//判断文件
if (fileNames.size() <= 0)
return FUNC_CANNOT_CALC;
......@@ -5131,11 +5256,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);
logger.t(logModule + "开始从本地加载模板文件...");
loadTrackModel(fileName.c_str(), tplMat, cv::Point(), matchDeg, "eyemInitModel");
}
catch (...) {
logger.t("[" + logModule + "]" + "加载模板异常...");
logger.t(logModule + "从本地加载模板文件异常...");
return FUNC_CANNOT_CALC;
}
......@@ -5150,14 +5275,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
int _Size = tplMat.cols*tplMat.rows * sizeof(unsigned char);
//数据
logger.t("[" + logModule + "]" + "分配模板图像内存...");
logger.t(logModule + "分配模板图像内存...");
modelID.vpImage = (unsigned char *)malloc(_Size);
if (NULL == modelID.vpImage)
return FUNC_NOT_ENOUGH_MEM;
//拷贝数据
logger.t("[" + logModule + "]" + "拷贝模板数据...");
logger.t(logModule + "拷贝模板数据...");
memcpy(modelID.vpImage, _tplMat.data, _Size);
//位置
......@@ -5170,7 +5295,7 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
modelID.dMatchDeg = matchDeg;
//名称?会导致内存泄露吗
logger.t("[" + logModule + "]" + "分配模板文件名内存...");
logger.t(logModule + "分配模板文件名内存...");
modelID.lpszName = (char *)CoTaskMemAlloc(128);
if (NULL != modelID.lpszName)
{
......@@ -5180,8 +5305,8 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
}
else return FUNC_NOT_ENOUGH_MEM;
//压入容器
logger.t("[" + logModule + "]" + "将模板压入容器...");
//压入容器末尾
logger.t(logModule + "将模板压入容器...");
tpModelID->push_back(modelID);
}
}
......@@ -5215,9 +5340,16 @@ int eyemAchvModelByName(const char *ccTplName, IntPtr hModelID, EyemModelID &tpM
int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
{
std::string logModule = "";
logModule += __func__;
logModule += "(" + std::to_string(*(uint32_t *)(&std::this_thread::get_id())) + "):";
if (NULL == hModelID)
return FUNC_CANNOT_CALC;
logger.t(logModule + "从指针获取模板对象...");
std::vector<EyemModelID> *tpModelID = reinterpret_cast<std::vector<EyemModelID>*>(hModelID);
//判断是否重复
......@@ -5233,9 +5365,11 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
try
{
loadTrackModel(ccTplName, tplMat, cv::Point(), matchDeg);
logger.t(logModule + "开始从本地加载模板文件...");
loadTrackModel(ccTplName, tplMat, cv::Point(), matchDeg, "eyemInsertModel");
}
catch (...) {
logger.t(logModule + "从本地加载模板文件异常...");
return FUNC_CANNOT_CALC;
}
......@@ -5251,12 +5385,14 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
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);
//位置
......@@ -5269,6 +5405,7 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
modelID.dMatchDeg = matchDeg;
//名称
logger.t(logModule + "分配模板文件名内存...");
modelID.lpszName = (char *)CoTaskMemAlloc(128);
if (NULL != modelID.lpszName)
{
......@@ -5280,7 +5417,8 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
return FUNC_NOT_ENOUGH_MEM;
}
//压入堆栈
//压入容器末尾
logger.t(logModule + "将模板压入容器...");
tpModelID->push_back(modelID);
}
else {
......
......@@ -16,7 +16,9 @@ constexpr double c = PI / 180.;
std::mutex mtx_misc;
Logger logger;
extern Logger logger;
extern int killProcessID;
#endif/* __EYEM_MISC_H */
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!