Commit 5d801ec0 张士柳

1 个父辈 5fb7556d
...@@ -780,6 +780,9 @@ namespace eyemLib_Sharp ...@@ -780,6 +780,9 @@ namespace eyemLib_Sharp
//插件机 //插件机
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)] [DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, IntPtr tpArray, int iArraySize); 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 #endregion
#region 日志功能 #region 日志功能
...@@ -794,8 +797,12 @@ namespace eyemLib_Sharp ...@@ -794,8 +797,12 @@ namespace eyemLib_Sharp
OnNewLogCallback?.Invoke(msg); OnNewLogCallback?.Invoke(msg);
} }
public static log4cpp.LogManager logcpp = null;
public static void Init() public static void Init()
{ {
logcpp = new log4cpp.LogManager("D:\\日志\\", "_运行日志", log4cpp.GenerateMode.ByEveryDay);
setLogCallback(sld); setLogCallback(sld);
OnNewLogCallback += new TCallBack(EyemLib_OnNewLogCallback); OnNewLogCallback += new TCallBack(EyemLib_OnNewLogCallback);
...@@ -809,7 +816,13 @@ namespace eyemLib_Sharp ...@@ -809,7 +816,13 @@ namespace eyemLib_Sharp
//记录日志 //记录日志
private static void EyemLib_OnNewLogCallback(string msg) 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 #endregion
...@@ -1024,9 +1037,17 @@ namespace eyemLib_Sharp ...@@ -1024,9 +1037,17 @@ namespace eyemLib_Sharp
//插入模板 //插入模板
flag = eyemInsertModel(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl"); 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(); 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(); //EyemImage tpModeImg = new EyemImage();
//tpModeImg.iChannels = 1; tpModeImg.iDepth = 0; //tpModeImg.iChannels = 1; tpModeImg.iDepth = 0;
...@@ -1046,7 +1067,7 @@ namespace eyemLib_Sharp ...@@ -1046,7 +1067,7 @@ namespace eyemLib_Sharp
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), 35, 0, 100, 5, ref pNumObj, out tpDstImg); //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); //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); //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); //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 ...@@ -10,27 +10,32 @@ namespace eyemLib_Sharp
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
DirectoryInfo di = new DirectoryInfo("D:\\日志\\");
if (!di.Exists)
{
di.Create();
}
//初始化 //初始化
EyemLib.Init(); EyemLib.Init();
string[] fileNames = Directory.GetFiles(@"D:\批量测试图像\", "*.*", SearchOption.AllDirectories); string[] fileNames = Directory.GetFiles(@"D:\批量测试图像\", "*.*", SearchOption.AllDirectories);
//for (int j = 0; j < 250; j++) for (int j = 0; j < 1250; 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)
{ {
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++) //for (int i = 0; i < 1; i++)
//{ //{
// EyemLib.eyemTestVideoCapture("D:\\插件完成检测\\视频\\cap5.mp4"); // EyemLib.eyemTestVideoCapture("D:\\插件完成检测\\视频\\cap5.mp4");
......
...@@ -50,6 +50,9 @@ ...@@ -50,6 +50,9 @@
<ItemGroup> <ItemGroup>
<Compile Include="EyemLib.cs" /> <Compile Include="EyemLib.cs" />
<Compile Include="EyemLibDemo.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="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </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) ...@@ -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"; char* filename = "D:\\Matlab测试图像\\circle_plate_04.png";
cv::Mat src = cv::imread(filename, cv::IMREAD_UNCHANGED); cv::Mat src = cv::imread(filename, cv::IMREAD_UNCHANGED);
if (src.empty()) { 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 \ No newline at end of file
...@@ -864,6 +864,9 @@ extern "C" { ...@@ -864,6 +864,9 @@ extern "C" {
} }
#endif #endif
//跳过某接口执行
extern "C" __declspec(dllexport) void setSkipProcessID(int pid);
// 日志回调定义 // 日志回调定义
typedef void(__stdcall*TCallback)(const char* msg); typedef void(__stdcall*TCallback)(const char* msg);
......
此文件类型无法预览
...@@ -269,21 +269,23 @@ static void split(const std::string &cStrText, const std::string &cStrDelim, std ...@@ -269,21 +269,23 @@ static void split(const std::string &cStrText, const std::string &cStrDelim, std
/** 载入模板 /** 载入模板
trackMat 输入文件名 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 += __func__;
logModule += "(" + std::to_string(*(uint32_t *)(&std::this_thread::get_id())) + "):";
struct stat _Stat; struct stat _Stat;
if (stat(fileName, &_Stat) != 0) if (stat(fileName, &_Stat) != 0)
return; return;
//上锁 //上锁
logger.t("[" + logModule + "]" + "上锁..."); logger.t(logModule + "上锁...");
mtx_misc.lock(); mtx_misc.lock();
logger.t("[" + logModule + "]" + "打开文件..."); logger.t(logModule + "打开文件...");
FILE *fps = NULL; FILE *fps = NULL;
fopen_s(&fps, fileName, "r"); fopen_s(&fps, fileName, "r");
...@@ -304,19 +306,19 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi ...@@ -304,19 +306,19 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
memset(_Data, 0, _Size); memset(_Data, 0, _Size);
//读取数据 //读取数据
logger.t("[" + logModule + "]" + "读取数据..."); logger.t(logModule + "读取二进制数据...");
fread(_Data, sizeof(uint8_t), _Size, fps); fread(_Data, sizeof(uint8_t), _Size, fps);
//关闭文件 //关闭文件
logger.t("[" + logModule + "]" + "关闭文件..."); logger.t(logModule + "关闭文件...");
fclose(fps); fclose(fps);
//解锁 //解锁
logger.t("[" + logModule + "]" + "解锁..."); logger.t(logModule + "解锁...");
mtx_misc.unlock(); mtx_misc.unlock();
//获取图像数据大小 //获取图像数据大小
logger.t("[" + logModule + "]" + "拷贝头数据..."); logger.t(logModule + "拷贝头数据...");
unsigned char _SizeData[8]; unsigned char _SizeData[8];
memcpy(_SizeData, _Data, 8); memcpy(_SizeData, _Data, 8);
...@@ -327,33 +329,33 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi ...@@ -327,33 +329,33 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
const int tplSize = _Size - valSize - 8; const int tplSize = _Size - valSize - 8;
//拷贝文件信息 //拷贝文件信息
logger.t("[" + logModule + "]" + "拷贝文件信息..."); logger.t(logModule + "拷贝文件信息...");
char *tplInfo = new char[tplSize]; char *tplInfo = new char[tplSize];
memcpy(tplInfo, _Data + valSize + 8, tplSize); memcpy(tplInfo, _Data + valSize + 8, tplSize);
//获取文件信息 //获取文件信息
logger.t("[" + logModule + "]" + "分割字符串..."); logger.t(logModule + "分割字符串...");
std::string line(tplInfo); std::string line(tplInfo);
std::vector<std::string> hints; std::vector<std::string> hints;
split(line, ",", 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()); 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())); 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); tplMat.create(Y, X, CV_8UC1, -1, true);
//拷贝数据 //拷贝数据
logger.t("[" + logModule + "]" + "拷贝图像数据..."); logger.t(logModule + "拷贝图像数据...");
cv::Mat _tplMat = tplMat.getMat(); cv::Mat _tplMat = tplMat.getMat();
memcpy(_tplMat.data, _Data + 8, valSize); memcpy(_tplMat.data, _Data + 8, valSize);
//释放内存 //释放内存
logger.t("[" + logModule + "]" + "释放内存..."); logger.t(logModule + "释放内存...");
delete[] tplInfo; delete[] tplInfo;
tplInfo = NULL; tplInfo = NULL;
...@@ -465,7 +467,7 @@ static double getThreshVal_Otsu_8u(const cv::Mat& _src) ...@@ -465,7 +467,7 @@ static double getThreshVal_Otsu_8u(const cv::Mat& _src)
size.width *= size.height; size.width *= size.height;
size.height = 1; size.height = 1;
step = size.width; step = size.width;
} }
#ifdef HAVE_IPP #ifdef HAVE_IPP
unsigned char thresh = 0; unsigned char thresh = 0;
...@@ -659,6 +661,12 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou ...@@ -659,6 +661,12 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
if (src.channels() != 1) if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY); 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(); 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 ...@@ -1098,6 +1106,12 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel); cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do do
{ {
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个) //不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin; std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); 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 ...@@ -1376,6 +1390,13 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -1549,6 +1570,13 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou ...@@ -1549,6 +1570,13 @@ int eyemCountObject(EyemImage tpImage, EyemRect tpRoi, const char *fileName, dou
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -1628,6 +1656,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -1628,6 +1656,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
if (src.channels() != 1) if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY); 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(); 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 ...@@ -1953,6 +1987,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel); cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do do
{ {
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个) //不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin; std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
...@@ -2230,6 +2270,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -2230,6 +2270,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -2403,6 +2450,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -2403,6 +2450,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -2605,6 +2659,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -2605,6 +2659,12 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel); cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do do
{ {
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个) //不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin; std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
...@@ -2882,6 +2942,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -2882,6 +2942,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -3055,6 +3122,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -3055,6 +3122,13 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -3163,6 +3237,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP ...@@ -3163,6 +3237,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
if (src.channels() != 1) if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY); 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(); 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 ...@@ -3602,6 +3682,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel); cv::Mat trackMat(Y, X, CV_8UC1, ucpTrackLabel);
do do
{ {
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 点料阶段被跳过执行...");
break;
}
//不随机挑选起点(考虑换成面积最小的那个) //不随机挑选起点(考虑换成面积最小的那个)
std::vector<cv::Point> contourMin; std::vector<cv::Point> contourMin;
cv::findContours(image, contoursFilter, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); 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 ...@@ -3880,6 +3966,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -4053,6 +4145,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP ...@@ -4053,6 +4145,12 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
} }
} }
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -4136,6 +4234,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4136,6 +4234,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
if (src.empty() || NULL == hModelID) { if (src.empty() || NULL == hModelID) {
return FUNC_IMAGE_NOT_EXIST; return FUNC_IMAGE_NOT_EXIST;
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 初始阶段被跳过执行...");
return FUNC_CANNOT_CALC;
}
double begin0 = (double)cv::getTickCount(); double begin0 = (double)cv::getTickCount();
//转单通道图像 //转单通道图像
...@@ -4544,6 +4649,12 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -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) 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); cv::Point2f startCenter((float)(*itv).x, (float)(*itv).y);
...@@ -4761,6 +4872,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4761,6 +4872,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5); //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; //std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
trackEnd = (!found); trackEnd = (!found);
...@@ -4923,6 +5039,12 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4923,6 +5039,12 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5); //cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
} }
//跳过执行
if (killProcessID == 0) {
logger.t("eyemCountObjectIrregularPartsE 追踪阶段被跳过执行...");
found = false;
}
trackEnd = (!found); trackEnd = (!found);
} while (!trackEnd); } while (!trackEnd);
} }
...@@ -5113,11 +5235,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID) ...@@ -5113,11 +5235,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
std::string logModule = ""; std::string logModule = "";
logModule += __func__; logModule += __func__;
logger.t("[" + logModule + "]" + "初始化模板..."); logModule += "(" + std::to_string(*(uint32_t *)(&std::this_thread::get_id())) + "):";
logger.t(logModule + "初始化模板...");
//获取文件路径 //获取文件路径
std::vector<std::string> fileNames; std::vector<std::string> fileNames;
cv::glob(ccTplName, fileNames); cv::glob(ccTplName, fileNames);
logger.t("[" + logModule + "]" + "获取文件名...");
logger.t(logModule + "获取文件名...");
//判断文件 //判断文件
if (fileNames.size() <= 0) if (fileNames.size() <= 0)
return FUNC_CANNOT_CALC; return FUNC_CANNOT_CALC;
...@@ -5131,11 +5256,11 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID) ...@@ -5131,11 +5256,11 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
cv::Mat tplMat; double matchDeg; cv::Mat tplMat; double matchDeg;
try try
{ {
logger.t("[" + logModule + "]" + "根据文件名加载模板..."); logger.t(logModule + "开始从本地加载模板文件...");
loadTrackModel(fileName.c_str(), tplMat, cv::Point(), matchDeg); loadTrackModel(fileName.c_str(), tplMat, cv::Point(), matchDeg, "eyemInitModel");
} }
catch (...) { catch (...) {
logger.t("[" + logModule + "]" + "加载模板异常..."); logger.t(logModule + "从本地加载模板文件异常...");
return FUNC_CANNOT_CALC; return FUNC_CANNOT_CALC;
} }
...@@ -5150,14 +5275,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID) ...@@ -5150,14 +5275,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
int _Size = tplMat.cols*tplMat.rows * sizeof(unsigned char); int _Size = tplMat.cols*tplMat.rows * sizeof(unsigned char);
//数据 //数据
logger.t("[" + logModule + "]" + "分配模板图像内存..."); logger.t(logModule + "分配模板图像内存...");
modelID.vpImage = (unsigned char *)malloc(_Size); modelID.vpImage = (unsigned char *)malloc(_Size);
if (NULL == modelID.vpImage) if (NULL == modelID.vpImage)
return FUNC_NOT_ENOUGH_MEM; return FUNC_NOT_ENOUGH_MEM;
//拷贝数据 //拷贝数据
logger.t("[" + logModule + "]" + "拷贝模板数据..."); logger.t(logModule + "拷贝模板数据...");
memcpy(modelID.vpImage, _tplMat.data, _Size); memcpy(modelID.vpImage, _tplMat.data, _Size);
//位置 //位置
...@@ -5170,7 +5295,7 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID) ...@@ -5170,7 +5295,7 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
modelID.dMatchDeg = matchDeg; modelID.dMatchDeg = matchDeg;
//名称?会导致内存泄露吗 //名称?会导致内存泄露吗
logger.t("[" + logModule + "]" + "分配模板文件名内存..."); logger.t(logModule + "分配模板文件名内存...");
modelID.lpszName = (char *)CoTaskMemAlloc(128); modelID.lpszName = (char *)CoTaskMemAlloc(128);
if (NULL != modelID.lpszName) if (NULL != modelID.lpszName)
{ {
...@@ -5180,8 +5305,8 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID) ...@@ -5180,8 +5305,8 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
} }
else return FUNC_NOT_ENOUGH_MEM; else return FUNC_NOT_ENOUGH_MEM;
//压入容器 //压入容器末尾
logger.t("[" + logModule + "]" + "将模板压入容器..."); logger.t(logModule + "将模板压入容器...");
tpModelID->push_back(modelID); tpModelID->push_back(modelID);
} }
} }
...@@ -5215,9 +5340,16 @@ int eyemAchvModelByName(const char *ccTplName, IntPtr hModelID, EyemModelID &tpM ...@@ -5215,9 +5340,16 @@ int eyemAchvModelByName(const char *ccTplName, IntPtr hModelID, EyemModelID &tpM
int eyemInsertModel(IntPtr hModelID, const char *ccTplName) 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) if (NULL == hModelID)
return FUNC_CANNOT_CALC; return FUNC_CANNOT_CALC;
logger.t(logModule + "从指针获取模板对象...");
std::vector<EyemModelID> *tpModelID = reinterpret_cast<std::vector<EyemModelID>*>(hModelID); std::vector<EyemModelID> *tpModelID = reinterpret_cast<std::vector<EyemModelID>*>(hModelID);
//判断是否重复 //判断是否重复
...@@ -5233,9 +5365,11 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName) ...@@ -5233,9 +5365,11 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
try try
{ {
loadTrackModel(ccTplName, tplMat, cv::Point(), matchDeg); logger.t(logModule + "开始从本地加载模板文件...");
loadTrackModel(ccTplName, tplMat, cv::Point(), matchDeg, "eyemInsertModel");
} }
catch (...) { catch (...) {
logger.t(logModule + "从本地加载模板文件异常...");
return FUNC_CANNOT_CALC; return FUNC_CANNOT_CALC;
} }
...@@ -5251,12 +5385,14 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName) ...@@ -5251,12 +5385,14 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
int _Size = tplMat.cols*tplMat.rows * sizeof(unsigned char); int _Size = tplMat.cols*tplMat.rows * sizeof(unsigned char);
//数据 //数据
logger.t(logModule + "分配图像内存...");
modelID.vpImage = (unsigned char *)malloc(_Size); modelID.vpImage = (unsigned char *)malloc(_Size);
if (NULL == modelID.vpImage) if (NULL == modelID.vpImage)
return FUNC_NOT_ENOUGH_MEM; return FUNC_NOT_ENOUGH_MEM;
//拷贝数据 //拷贝数据
logger.t(logModule + "拷贝图像数据...");
memcpy(modelID.vpImage, _tplMat.data, _Size); memcpy(modelID.vpImage, _tplMat.data, _Size);
//位置 //位置
...@@ -5269,6 +5405,7 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName) ...@@ -5269,6 +5405,7 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
modelID.dMatchDeg = matchDeg; modelID.dMatchDeg = matchDeg;
//名称 //名称
logger.t(logModule + "分配模板文件名内存...");
modelID.lpszName = (char *)CoTaskMemAlloc(128); modelID.lpszName = (char *)CoTaskMemAlloc(128);
if (NULL != modelID.lpszName) if (NULL != modelID.lpszName)
{ {
...@@ -5280,7 +5417,8 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName) ...@@ -5280,7 +5417,8 @@ int eyemInsertModel(IntPtr hModelID, const char *ccTplName)
return FUNC_NOT_ENOUGH_MEM; return FUNC_NOT_ENOUGH_MEM;
} }
//压入堆栈 //压入容器末尾
logger.t(logModule + "将模板压入容器...");
tpModelID->push_back(modelID); tpModelID->push_back(modelID);
} }
else { else {
......
...@@ -16,7 +16,9 @@ constexpr double c = PI / 180.; ...@@ -16,7 +16,9 @@ constexpr double c = PI / 180.;
std::mutex mtx_misc; std::mutex mtx_misc;
Logger logger; extern Logger logger;
extern int killProcessID;
#endif/* __EYEM_MISC_H */ #endif/* __EYEM_MISC_H */
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!