Commit 1d76f9a7 张士柳

1 个父辈 6b410e45
......@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Drawing.Drawing2D;
namespace eyemLib_Sharp
{
......@@ -58,6 +59,20 @@ namespace eyemLib_Sharp
public EyemRect[] bboxes;
}
[StructLayout(LayoutKind.Sequential)]
public struct RotateBox
{
//最多支持25个目标
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)]
public EyemOcsIXY[] p1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)]
public EyemOcsIXY[] p2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)]
public EyemOcsIXY[] p3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)]
public EyemOcsIXY[] p4;
}
///////////////////////////////////////////////////////////////////////////////
// Orthogonal Coordinate System
......@@ -1038,6 +1053,14 @@ namespace eyemLib_Sharp
/// <returns></returns>
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemNNDetector(EyemImage tpImage, out int ipNum, ref BboxContainer container, out EyemImage tpDstImg);
//实例分割
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemNNInstanceSegment(EyemImage tpImage, float fThreshold, ref RotateBox container, out EyemImage tpDstImg);
//获取旋转图像
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemAchvRotateImage(EyemImage tpImage, EyemOcsIXY p1, EyemOcsIXY p2, EyemOcsIXY p3, EyemOcsIXY p4, out EyemImage tpDstImg);
/// <summary>
/// 初始化darknet分类器
/// </summary>
......@@ -1199,11 +1222,11 @@ namespace eyemLib_Sharp
#region 测试专用接口
//测试接口
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemLibImpl(EyemImage tpImage, out EyemImage tpDstImg);
private static extern int eyemLibImpl(EyemImage tpImage, string fileName, out EyemImage tpDstImg);
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemCkReelStatus(EyemImage tpImage, string lpszConfigPath, ref int iStatus);
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemEdge1dRidgeDetection(EyemImage tpImage);
[DllImport("eyemLib.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
private static extern int eyemAchvMaskImage(EyemImage tpImage, out EyemImage tpDstImg, out EyemImage tpPrevImg);
......@@ -1255,6 +1278,8 @@ namespace eyemLib_Sharp
//eyemInitONNXModel("D:\\训练数据集\\Parts-11\\backup\\ec_model.onnx");
//eyemInitCounter("D://pre_segmentation.onnx");
//eyemInitNNDetector("", "d://2dCodeDetector.onnx", 640, 640);
}
public static void Free()
......@@ -1278,6 +1303,8 @@ namespace eyemLib_Sharp
#endregion
public enum Teser { NNDetectorTool, NNDataCodelTool };
public static void eyemReadImageTool(string fileName)
{
EyemImage image = new EyemImage();
......@@ -1291,21 +1318,13 @@ namespace eyemLib_Sharp
Stopwatch sw = new Stopwatch();
sw.Restart();
string file = fileName.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries)[2];
//_ = eyemBinThreshold(image, 1, 45, 255, out tpDstImg);
////eyemNamedWindow("test");
////eyemImshow("test", image);
////eyemWaitkey();
//return;
//flag = eyemInitNNDetector(".\\darknet\\cifar_resnet50.cfg", ".\\darknet\\cifar_resnet50.weights", 640, 640);
//flag = eyemInitNNDetector("", "d://tray_detectv7.onnx", 640, 640);
//flag = eyemInitNNDetector(".\\darknet\\detect-tiny-label.cfg", ".\\darknet\\detect-tiny-label.weights", 640, 640);
//if (flag == 0)
//{
// eyemNNDetectorParams(0.35f, 0.45f);
// int ipNum;
// eyemNNDetectorParams(0.5f, 0.45f);
// sw.Restart();
// BboxContainer bboxes = new BboxContainer();
// eyemNNDetector(image, out ipNum, ref bboxes, out tpDstImg);
// eyemNNDetector(image, out _, ref bboxes, out tpDstImg);
// Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
// if (bitmap != null)
// {
......@@ -1317,36 +1336,66 @@ namespace eyemLib_Sharp
//Console.WriteLine(sw.ElapsedMilliseconds.ToString());
//eyemImageFree(ref image);
//return;
if (true)
{
///实例分割
///
flag = eyemInitNNDetector("", "D://yolact_base_169_14550_interrupt.onnx", 550, 550);
if (flag == 0)
{
eyemNNDetectorParams(0.15f, 0.45f);
sw.Restart();
RotateBox container = new RotateBox();
eyemNNInstanceSegment(image,0.15F, ref container, out tpDstImg);
for (int i = 0; i < 25; i++)
{
if (container.p1[i].iX != 0)
{
eyemAchvRotateImage(image, container.p1[i], container.p2[i], container.p3[i], container.p4[i], out tpDstImg);
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
if (bitmap != null)
{
bitmap.Save("D:\\ResOut\\" + file);
}
eyemImageFree(ref tpDstImg);
}
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());
eyemImageFree(ref image);
return;
}
//flag = eyemInitNNDataCodeModel(".\\darknet\\detect-tiny.cfg", ".\\darknet\\detect-tiny.weights", "", "") & eyemInitNNDetector(".\\darknet\\detect-tiny-label.cfg", ".\\darknet\\detect-tiny-label.weights");
////红色分割
//EyemHSVModel tpHsvModel = new EyemHSVModel();
//tpHsvModel.dpRangeL = new double[] { 0, 43, 46 }; tpHsvModel.dpRangeU = new double[] { 10, 255, 255 };
//tpHsvModel.dpRangeL = new double[] { 0, 124, 18 }; tpHsvModel.dpRangeU = new double[] { 10, 255, 255 };
//tpHsvModel.dpRangeLExt = new double[] { 156, 43, 46 }; tpHsvModel.dpRangeUExt = new double[] { 180, 255, 255 };
////绿色分割模型
//EyemHSVModel tpHsvModel = new EyemHSVModel();
//tpHsvModel.dpRangeL = new double[] { 55, 10, 35 }; tpHsvModel.dpRangeU = new double[] { 100, 255, 255 };
//tpHsvModel.dpRangeL = new double[] { 57, 15, 0 }; tpHsvModel.dpRangeU = new double[] { 93, 255, 255 };
//tpHsvModel.dpRangeLExt = new double[] { 0, 0, 0 }; tpHsvModel.dpRangeUExt = new double[] { 0, 0, 0 };
////绿色分割模型
//EyemHSVModel tpHsvModel = new EyemHSVModel();
//tpHsvModel.dpRangeL = new double[] { 55, 10, 35 }; tpHsvModel.dpRangeU = new double[] { 100, 255, 255 };
//tpHsvModel.dpRangeLExt = new double[] { 0, 0, 0 }; tpHsvModel.dpRangeUExt = new double[] { 0, 0, 0 };
//////绿色分割模型
////EyemHSVModel tpHsvModel = new EyemHSVModel();
////tpHsvModel.dpRangeL = new double[] { 55, 10, 35 }; tpHsvModel.dpRangeU = new double[] { 100, 255, 255 };
////tpHsvModel.dpRangeLExt = new double[] { 0, 0, 0 }; tpHsvModel.dpRangeUExt = new double[] { 0, 0, 0 };
//EyemRect tpRoi0 = new EyemRect();
//tpRoi0.iXs = 0; tpRoi0.iYs = 0;
//tpRoi0.iWidth = image.iWidth;
//tpRoi0.iHeight = image.iHeight;
////sw.Restart();
//////sw.Restart();
//List<EyemRect> tpRois = new List<EyemRect>();
//EyemRect roi1 = new EyemRect();
//roi1.iXs = 470; roi1.iYs = 143; roi1.iWidth = 411; roi1.iHeight = 387;
//roi1.iXs = 1120; roi1.iYs = 737; roi1.iWidth = 296; roi1.iHeight = 282;
//EyemRect roi2 = new EyemRect();
//roi2.iXs = 882; roi2.iYs = 84; roi2.iWidth = 317; roi2.iHeight = 251;
//roi2.iXs = 1405; roi2.iYs = 611; roi2.iWidth = 236; roi2.iHeight = 202;
////添加需要监控的位置信息
//tpRois.Add(roi1); tpRois.Add(roi2);
......@@ -1356,7 +1405,7 @@ namespace eyemLib_Sharp
////加载mask
//EyemImage mask;
//eyemImageRead("mask.png", -1, out mask);
//eyemImageRead("d://mask.png", -1, out mask);
////
//int[] ipResults = new int[tpRois.Count];
......@@ -1371,6 +1420,8 @@ namespace eyemLib_Sharp
//}
//sw.Stop();
//Console.WriteLine("时间花费:" + sw.ElapsedMilliseconds.ToString());
////蓝色分割
//EyemHSVModel tpHsvModel = new EyemHSVModel();
//tpHsvModel.dpRangeL = new double[] { 100, 43, 46 }; tpHsvModel.dpRangeU = new double[] { 124, 255, 255 };
......@@ -1424,6 +1475,10 @@ namespace eyemLib_Sharp
//tpHsvModel.dpRangeLExt = new double[] { 0, 0, 0 }; tpHsvModel.dpRangeUExt = new double[] { 0, 0, 0 };
//EyemImage tpMask;
//eyemBinThresholdC(image, tpHsvModel, out tpMask);
////
//eyemImageRead("D://批量测试图像//Image_20230330152916811.bmp", -1, out image);
//eyemBinThresholdC(image, tpHsvModel, out image);
//EyemRect tpRoi0 = new EyemRect();
//tpRoi0.iXs = 4420; tpRoi0.iYs = 2206;
//tpRoi0.iWidth = 639;
......@@ -1432,38 +1487,40 @@ namespace eyemLib_Sharp
//flag = eyemAOIPreprocessingForTSAV(image, tpRoi0, out tpDstImg);
//sw.Stop();
//Console.WriteLine("时间花费:" + sw.ElapsedMilliseconds.ToString());
flag = eyemLibImpl(image, out tpDstImg);
return;
//int iStatus = -1;
//flag = eyemCkReelStatus(image, "D:/config2.txt", ref iStatus);
//flag = eyemLibImpl(image, "", out tpDstImg);
//
//eyemImageRead("D:/mask.png", 0, out tpMask);
//Bitmap bitmap = eyemCvtToBitmap(image);
//Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//eyemBinThresholdC(image, tpHsvModel, out image);
//eyemNamedWindow("image");
//eyemImshow("image", image);
//eyemWaitkey();
//EyemOcsIXY[] tpResults = new EyemOcsIXY[4];
//var hHandle = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(EyemOcsIXY)) * tpResults.Length);
//double dThickness = 0;
//eyemCalcReelTHK(image, tpMask, hHandle, ref dThickness);
//tpResults = eyemIntPtr2StructArray<EyemOcsIXY>(hHandle, tpResults.Length).ToArray();
//using (var g = Graphics.FromImage(bitmap))
//Bitmap bitmap0 = eyemCvtToBitmap(image);
//using (var g = Graphics.FromImage(bitmap0))
//{
// for (int i = 0; i < 4; i++)
// {
// g.DrawLine(new Pen(Brushes.LimeGreen, 12), new Point(tpResults[i].iX, tpResults[i].iY), new Point(tpResults[(i + 1) % 4].iX, tpResults[(i + 1) % 4].iY));
// }
//}
//if (bitmap != null)
//if (bitmap0 != null)
//{
// bitmap.Save("D:\\ResOut\\" + file);
// bitmap0.Save("D:\\ResOut\\" + file);
//}
//eyemImageFree(ref image);
////eyemImageFree(ref tpMask);
//eyemImageFree(ref tpMask);
//eyemImageFree(ref tpDstImg);
//Marshal.FreeHGlobal(hHandle);
//return;
......@@ -1499,8 +1556,8 @@ namespace eyemLib_Sharp
//每运行检测一次释放一次
//eyemImageFree(ref tpDstImg);
//eyemImageFree(ref image);
//////////mask可以在程序启动与关闭时加载/释放
//eyemImageFree(ref tpMask);
////////mask可以在程序启动与关闭时加载/释放
//eyemImageFree(ref mask);
//eyemImageFree(ref tpDstImg);
//////eyemImageFree(ref tpPrevImg);
//return;
......@@ -1943,7 +2000,7 @@ namespace eyemLib_Sharp
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS","IP_SQUARE_PARTS","IP_DYNAMIC_PARTS","","IP_DYNAMIC_SP1","IP_DYNAMIC_SP2"
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), ipReelNum, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), "IP_LARGE_PARTS", ipReelNum, out tpDstImg);
//eyemCountObjectE(image, tpRoi, file.Replace(".png", ""), ipReelNum, out tpDstImg);
eyemCountObjectE(image, tpRoi, file.Replace(".png", ""), ipReelNum, out tpDstImg);
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + "20210825095751-1.tpl", hModelID, ipReelNum, out tpDstImg);
//算法选项
//std::string sOptions[8] = { "IP_DEFAULT_PARTS","IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS","IP_SQUARE_PARTS","","IP_DYNAMIC_SP1","IP_DYNAMIC_SP2" };
......
......@@ -20,8 +20,11 @@ namespace eyemLib_Sharp
string[] fileNames = Directory.GetFiles(@"D:\批量测试图像\", "*.*", SearchOption.AllDirectories);
foreach (var item in fileNames)
{
if (item.EndsWith("png") || item.EndsWith("jpg") || item.EndsWith("bmp"))
{
EyemLib.eyemReadImageTool(item);
}
}
EyemLib.Free();
Console.Write("请按任意键继续。。。");
Console.ReadKey();
......
......@@ -68,6 +68,18 @@
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_V455Qisda|AnyCPU'">
<OutputPath>..\x64\Release_V455Qisda\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
......
......@@ -31,6 +31,16 @@
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_V455Qisda|AnyCPU'">
<OutputPath>bin\Release_V455Qisda\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
......
......@@ -27,6 +27,9 @@ Global
Release_V455|Any CPU = Release_V455|Any CPU
Release_V455|x64 = Release_V455|x64
Release_V455|x86 = Release_V455|x86
Release_V455Qisda|Any CPU = Release_V455Qisda|Any CPU
Release_V455Qisda|x64 = Release_V455Qisda|x64
Release_V455Qisda|x86 = Release_V455Qisda|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
......@@ -52,6 +55,11 @@ Global
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455|x64.Build.0 = ReleaseV455|x64
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455|x86.ActiveCfg = ReleaseV455|Win32
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455|x86.Build.0 = ReleaseV455|Win32
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455Qisda|Any CPU.ActiveCfg = Release_V455Qisda|Win32
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455Qisda|x64.ActiveCfg = Release_V455Qisda|x64
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455Qisda|x64.Build.0 = Release_V455Qisda|x64
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455Qisda|x86.ActiveCfg = Release_V455Qisda|Win32
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release_V455Qisda|x86.Build.0 = Release_V455Qisda|Win32
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release|Any CPU.ActiveCfg = Release|Win32
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release|x64.ActiveCfg = Release|x64
{33D5F550-C799-4B05-8E14-ACA390DF5442}.Release|x64.Build.0 = Release|x64
......@@ -81,6 +89,12 @@ Global
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455|x64.Build.0 = ReleaseV455|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455|x86.ActiveCfg = ReleaseV455|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455|x86.Build.0 = ReleaseV455|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455Qisda|Any CPU.ActiveCfg = Release_V455Qisda|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455Qisda|Any CPU.Build.0 = Release_V455Qisda|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455Qisda|x64.ActiveCfg = Release_V455Qisda|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455Qisda|x64.Build.0 = Release_V455Qisda|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455Qisda|x86.ActiveCfg = Release_V455Qisda|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release_V455Qisda|x86.Build.0 = Release_V455Qisda|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release|Any CPU.Build.0 = Release|Any CPU
{C5284403-D4FD-4D83-BBAE-7A4020F1C01F}.Release|x64.ActiveCfg = Release|Any CPU
......@@ -111,6 +125,12 @@ Global
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455|x64.Build.0 = Release|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455|x86.ActiveCfg = Release|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455|x86.Build.0 = Release|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455Qisda|Any CPU.ActiveCfg = Release_V455Qisda|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455Qisda|Any CPU.Build.0 = Release_V455Qisda|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455Qisda|x64.ActiveCfg = Release_V455Qisda|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455Qisda|x64.Build.0 = Release_V455Qisda|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455Qisda|x86.ActiveCfg = Release_V455Qisda|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release_V455Qisda|x86.Build.0 = Release_V455Qisda|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release|Any CPU.Build.0 = Release|Any CPU
{E46DBA02-311F-417A-9221-6F4172498595}.Release|x64.ActiveCfg = Release|Any CPU
......
......@@ -130,7 +130,7 @@ float* AZONNXWrapper::forward(cv::Mat& img, cv::Scalar& mean, cv::Scalar& std)
return predictions;
}
void AZONNXWrapper::forward(cv::Mat& img, cv::Mat& labels, cv::Mat& stats, cv::Mat& drawResult, cv::Scalar& mean, cv::Scalar& std)
void AZONNXWrapper::forward(cv::Mat& img, cv::Mat& labels, cv::Scalar& mean, cv::Scalar& std)
{
#pragma warning( disable : 26451 )
CV_Assert(!img.empty());
......@@ -216,7 +216,6 @@ void AZONNXWrapper::forward(cv::Mat& img, cv::Mat& labels, cv::Mat& stats, cv::M
std::vector<int> indices;
cv::dnn::NMSBoxes(boxes, confidences, fConfThreshold, fNmsThreshold, indices, 1.f, 200);
//输出结果
labels = cv::Mat(Y, X, CV_32S, cv::Scalar(-1)), stats = cv::Mat(indices.size(), 5, CV_32FC1, cv::Scalar(0));
for (int i = 0; i < indices.size(); ++i)
{
int idx = indices[i];
......@@ -230,55 +229,53 @@ void AZONNXWrapper::forward(cv::Mat& img, cv::Mat& labels, cv::Mat& stats, cv::M
cv::Mat mask(this->mask_h, this->mask_w, CV_32FC1, cv::Scalar(0.f));
create_protomask(blobs, mask, this->mask_h, this->mask_w, maskIds[idx]);
//位置信息
stats.ptr<float_t>(i)[0] = box.x; stats.ptr<float_t>(i)[1] = box.y;
stats.ptr<float_t>(i)[2] = xmax; stats.ptr<float_t>(i)[3] = ymax; stats.ptr<float_t>(i)[4] = confidences[idx];
//恢复真实尺度
cv::resize(mask, mask, cv::Size(X, Y));
cv::Mat mask0(Y, X, CV_8UC1, cv::Scalar(0));
cv::rectangle(mask0, cv::Point(box.x, box.y), cv::Point(xmax, ymax), cv::Scalar(255), -1);
cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range range)->void {
for (int y = range.start; y < range.end; y++)
{
uchar* ptrmask = mask0.ptr<uchar>(y);
for (int x = 0; x < X; x++)
{
if (mask.ptr<float>(y)[x] > fConfThreshold && ptrmask[x] > 0) {
labels.ptr<int32_t>(y)[x] = label;
}
}
}
});
//标签与置信度
char text[256];
sprintf(text, "%s: %.2f", class_namesd[classIds[idx] + 1].c_str(), confidences[idx]);
int baseLine;
cv::Size labelSize = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
int ymin = MAX(box.y, labelSize.height);
cv::rectangle(cc, cv::Point(box.x, box.y - int(1.5 * labelSize.height) - 1), cv::Point(box.x + int(1.5 * labelSize.width), box.y - 1), cv::Scalar(0, 255, 255), cv::FILLED);
cv::putText(cc, text, cv::Point(box.x, ymin - 2), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 0, 255), 2);
}
//绘制mask
cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range range)->void {
for (int y = range.start; y < range.end; y++)
{
for (int x = 0; x < X; x++)
{
int label = labels.ptr<int32_t>(y)[x];
if (label != -1) {
transpMask.ptr<cv::Vec3b>(y)[x] = cv::Vec3b(colors[label][0], colors[label][1], colors[label][2]);
}
}
}
});
cv::addWeighted(cc, 0.7, transpMask, 0.3, 0, cc);
mask.copyTo(labels);
//cv::Mat mask0(Y, X, CV_8UC1, cv::Scalar(0));
//cv::rectangle(mask0, cv::Point(box.x, box.y), cv::Point(xmax, ymax), cv::Scalar(255), -1);
//cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range range)->void {
// for (int y = range.start; y < range.end; y++)
// {
// uchar* ptrmask = mask0.ptr<uchar>(y);
// for (int x = 0; x < X; x++)
// {
// if (mask.ptr<float>(y)[x] > fConfThreshold && ptrmask[x] > 0) {
// labels.ptr<int32_t>(y)[x] = label;
// }
// }
// }
// });
////标签与置信度
//char text[256];
//sprintf(text, "%s: %.2f", class_namesd[classIds[idx] + 1].c_str(), confidences[idx]);
//int baseLine;
//cv::Size labelSize = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
//int ymin = MAX(box.y, labelSize.height);
//cv::rectangle(cc, cv::Point(box.x, box.y - int(1.5 * labelSize.height) - 1), cv::Point(box.x + int(1.5 * labelSize.width), box.y - 1), cv::Scalar(0, 255, 255), cv::FILLED);
//cv::putText(cc, text, cv::Point(box.x, ymin - 2), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 0, 255), 2);
break;
}
labels.convertTo(labels, CV_8UC1, 255);
////绘制mask
//cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range range)->void {
// for (int y = range.start; y < range.end; y++)
// {
// for (int x = 0; x < X; x++)
// {
// int label = labels.ptr<int32_t>(y)[x];
// if (label != -1) {
// transpMask.ptr<cv::Vec3b>(y)[x] = cv::Vec3b(colors[label][0], colors[label][1], colors[label][2]);
// }
// }
// }
// });
//cv::addWeighted(cc, 0.7, transpMask, 0.3, 0, cc);
//
cc.copyTo(drawResult);
//cc.copyTo(drawResult);
//释放资源
delete[] priorbox;
priorbox = NULL;
......
......@@ -15,7 +15,7 @@ public:
~AZONNXWrapper();
int init(const std::string& model_path);
float* forward(cv::Mat& img, cv::Scalar& mean, cv::Scalar& std); //ResNet18提取特征[1,512]
void forward(cv::Mat& img, cv::Mat& labels, cv::Mat& stats, cv::Mat& drawResult, cv::Scalar& mean, cv::Scalar& std); //Yolact实例分割
void forward(cv::Mat& img, cv::Mat& labels, cv::Scalar& mean, cv::Scalar& std); //Yolact实例分割
std::vector<cv::Rect> forward(cv::Mat& img); //YOLOv7
void setInputParams(float, float, int);
private:
......
......@@ -1514,6 +1514,7 @@ int eyemBinBlob(EyemImage tpImage, IntPtr* hObject, EyemBlobParams tpParams, Eye
return FUNC_OK;
}
bool eyemBinFree(IntPtr hObject)
{
std::vector<EyemBinBlob>* tpResult = reinterpret_cast<std::vector<EyemBinBlob>*>(hObject);
......
......@@ -9,14 +9,14 @@
#ifndef FILEVERSION
#ifdef VQISDA
#define FILEVERSION "2.4.9.8 (Only Qisda)"
#define FILEVERSION "2.4.9.13 (Only Qisda)"
#else
#define FILEVERSION "2.4.9.11"
#define FILEVERSION "2.4.9.13"
#endif
#endif
#ifndef COPYRIGHT
#define COPYRIGHT "Copyright (C) 2020-2025 NeoTel. All Rights Reserved"
#define COPYRIGHT "Copyright (C) 2020-2025 Neotel Technology Co., Ltd. All rights reserved."
#endif
#ifndef ORIGINALFILENAME
......@@ -899,6 +899,13 @@ typedef struct {
EyemRect bboxes[100];
} BboxContainer;
typedef struct {
EyemOcsIXY p1[25];
EyemOcsIXY p2[25];
EyemOcsIXY p3[25];
EyemOcsIXY p4[25];
} RotateBox;
#ifdef __cplusplus
extern "C" {
#endif
......@@ -907,8 +914,9 @@ extern "C" {
EXPORTS int eyemInitNNDetector(const char* detectorConfigPath, const char* detectorModelPath, int iNetSizew, int iNetSizeh);
EXPORTS int eyemNNDetectorParams(float fConfidence, float fNMSThreshold);
EXPORTS int eyemNNDetector(EyemImage tpImage, int* ipNum, BboxContainer& container, EyemImage* tpDstImg);
EXPORTS int eyemInitClassifier(const char* classifierConfigPath, const char* classifierModelPath, int ntype);
EXPORTS int eyemClassifier(EyemImage tpImage);
EXPORTS int eyemNNInstanceSegment(EyemImage tpImage,float fThreshold, RotateBox& container, EyemImage* tpDstImg);
//EXPORTS int eyemInitClassifier(const char* classifierConfigPath, const char* classifierModelPath, int ntype);
//EXPORTS int eyemClassifier(EyemImage tpImage);
EXPORTS int eyemInitONNXModel(const char* extractorModelPath);
EXPORTS int eyemExtractWithONNX(EyemImage tpImage, float* fFeatures);
......@@ -970,7 +978,7 @@ extern "C" {
EXPORTS int eyemMarkerTracing(EyemImage tpImage, EyemHSVModel tpHSVModel, EyemOcsFXYR* tpCircle, EyemImage* tpDstImg, bool bHighAccuracy = false);
EXPORTS int eyemDetectCircleUseHough(EyemImage tpImage, EyemRect tpRoi, EyemRect limRoi, EyemOcsDXYR* tpCircle, EyemImage* tpDstImg, double dp, double dMinDist, double dParam1, double dParam2, double dMinRadius, double dMaxRadius, int iMethod = 3, bool useValLimit = false);
EXPORTS int eyemMulFuncTool(EyemImage tpImage, EyemRect tpRoi, const char* funcName, double dThreshold, int iNumToIgnore, EyemOcsFXYR* tpCircle, EyemImage* tpDstImg);
EXPORTS int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg);
EXPORTS int eyemLibImpl(EyemImage tpImage, const char* fileName, EyemImage* tpDstImg);
EXPORTS int eyemDrawLine(EyemImage tpImage, EyemOcsDABC tpLine);
EXPORTS int eyemDrawCircle(EyemImage tpImage, EyemOcsDXYR tpCircle);
EXPORTS int eyemDrawRectangle(EyemImage tpImag, EyemRect tpRect);
......@@ -980,6 +988,8 @@ extern "C" {
EXPORTS int eyemAchvMaskImage(EyemImage tpImage, EyemImage* tpDstImg, EyemImage* tpPrevImg);
EXPORTS int eyemSplitMask(EyemImage tpImage, EyemImage tpMask, const char* ccToPath, const char* ccClassName);
EXPORTS int eyemCalcReelTHK(EyemImage tpImage, EyemImage tpMask, EyemOcsIXY*, double& dThickness);
EXPORTS int eyemCkReelStatus(EyemImage tpImage, const char* lpszConfigPath, int& iStatus);
EXPORTS int eyemAchvRotateImage(EyemImage tpImage, EyemOcsIXY p1, EyemOcsIXY p2, EyemOcsIXY p3, EyemOcsIXY p4, EyemImage* tpDstImg);
#ifdef __cplusplus
......
此文件类型无法预览
......@@ -29,6 +29,14 @@
<Configuration>Release_V420Qisda</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_V455Qisda|Win32">
<Configuration>Release_V455Qisda</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_V455Qisda|x64">
<Configuration>Release_V455Qisda</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
......@@ -82,6 +90,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
......@@ -115,6 +130,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
......@@ -135,6 +157,9 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseV455|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
......@@ -150,6 +175,9 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseV455|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
......@@ -178,6 +206,9 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseV455|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>D:\3rdparty\opencv420\build\include;D:\3rdparty\opencv420\build\include\opencv2;D:\3rdparty\tbb2017_20170604oss\include;D:\3rdparty\zxing-cpp-master\core\src;D:\3rdparty\zxing-cpp-master\opencv\src;$(IncludePath)</IncludePath>
......@@ -196,6 +227,12 @@
<LibraryPath>D:\3rdparty\opencv455\build\x64\vc14\lib;D:\3rdparty\tbb2017_20170604oss\lib\intel64\vc14;D:\3rdparty\zxing-cpp-master\build\Release;$(LibraryPath)</LibraryPath>
<TargetExt>.dll</TargetExt>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|x64'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>D:\3rdparty\opencv455\build\include;D:\3rdparty\opencv455\build\include\opencv2;D:\3rdparty\tbb2017_20170604oss\include;D:\3rdparty\zxing-cpp-master\core\src;D:\3rdparty\zxing-cpp-master\opencv\src;$(IncludePath)</IncludePath>
<LibraryPath>D:\3rdparty\opencv455\build\x64\vc14\lib;D:\3rdparty\tbb2017_20170604oss\lib\intel64\vc14;D:\3rdparty\zxing-cpp-master\build\Release;$(LibraryPath)</LibraryPath>
<TargetExt>.dll</TargetExt>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
......@@ -327,6 +364,25 @@
<ModuleDefinitionFile>eyemLib.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ModuleDefinitionFile>eyemLib.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
......@@ -402,6 +458,31 @@
<ModuleDefinitionFile>eyemLib.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_V455Qisda|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_V455;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_STRUCT_TIMESPEC;VQISDA;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<OpenMPSupport>false</OpenMPSupport>
<EnableParallelCodeGeneration>true</EnableParallelCodeGeneration>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
<WholeProgramOptimization>true</WholeProgramOptimization>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libdmtx.lib;libzxing.lib;libdecode.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>eyemLib.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="azONNXWrapper.h" />
<ClInclude Include="barcodeDetector.h" />
......
......@@ -281,6 +281,28 @@ static void split(const std::string& cStrText, const std::string& cStrDelim, std
cpStr = NULL;
}
static std::vector<std::string> split(const std::string& str,
const std::string& delim) {
std::vector<std::string> res;
if ("" == str)
return res;
char* strs = new char[str.length() + 1];
std::strcpy(strs, str.c_str());
char* d = new char[delim.length() + 1];
std::strcpy(d, delim.c_str());
char* p = std::strtok(strs, d);
while (p) {
std::string s = p;
res.push_back(s);
p = std::strtok(NULL, d);
}
delete[] strs;
delete[] d;
return res;
}
/** 载入模板
trackMat 输入文件名
*/
......@@ -288,17 +310,14 @@ static void loadTrackModel(const char* fileName, cv::OutputArray tplMat, cv::Poi
{
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 + "打开文件...");
FILE* fps = NULL;
fopen_s(&fps, fileName, "r");
......@@ -309,10 +328,8 @@ static void loadTrackModel(const char* fileName, cv::OutputArray tplMat, cv::Poi
//获取文件大小
const int _Size = (int)_Stat.st_size;
//分配内存
unsigned char* _Data = (unsigned char*)malloc(_Size);
if (NULL == _Data)
return;
......@@ -329,7 +346,6 @@ static void loadTrackModel(const char* fileName, cv::OutputArray tplMat, cv::Poi
//解锁
logger.t(logModule + "解锁...");
//获取图像数据大小
logger.t(logModule + "拷贝头数据...");
unsigned char _SizeData[8];
......@@ -588,7 +604,8 @@ static void getSauvolaThreshold(const cv::Mat& _src, const int iWinSize, double
switch (3)
{
case BINARIZATION_SAUVOLA:
thresh = mean.mul(1. + static_cast<float>(dK) * (stddev / 128. - 1.));//8位灰度图像dR=128;0.2表示微调值影响不大
//auto tt = 1. + static_cast<float>(dK) * (stddev / 128. - 1.);
thresh = mean.mul(cv::Mat(1. + static_cast<float>(dK) * (stddev / 128. - 1.)));//8位灰度图像dR=128;0.2表示微调值影响不大
break;
}
thresh.convertTo(thresh, _src.depth());
......@@ -5428,8 +5445,11 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char*
{
if (strcmp(ccSubType, "IP_DYNAMIC_PARTS") == 0)
{
#ifdef VQISDA
#endif
//默认不处理
return FUNC_CANNOT_CALC;
return FUNC_OK;
}
else if (std::strcmp(ccSubType, "IP_DYNAMIC_SP1") == 0) //处理01005深色盘
{
......@@ -8037,7 +8057,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
cv::Mat cc;
cv::cvtColor(src8U, cc, cv::COLOR_GRAY2BGRA);
//设置bins
const int histSize = 17;
const int histSize = 17;//台湾代理商修改成12//原17
//取值范围
float range[] = { 0,255 };
const float* histRange = { range };
......@@ -8416,8 +8436,8 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
//判断元件尺寸
cv::Mat spliceMask;
int sinPartSize, sinPartMean, sinPartTotal;
bool useTrackMethod = /*checkSize(srcPrev, sinParts, sinPartSize);*/getIndComponents(srcPrev, rawImage,
sinParts, sinPartSize, sinPartMean, sinPartTotal, cc, spliceMask);
bool useTrackMethod = checkSize(srcPrev, sinParts, sinPartSize);/*getIndComponents(srcPrev, rawImage,
sinParts, sinPartSize, sinPartMean, sinPartTotal, cc, spliceMask)*/;//针对台湾环宏修改为checkSize方法
//判断大小
cv::Mat m1, m2, m3;
int nccomps = cv::connectedComponentsWithStats(sinParts, m1, m2, m3);
......@@ -8430,7 +8450,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
const int halfSize = (_winSize - 1) / 2;
//20220331测试用:灰度重建求局部极值(20220408--是否可以用累加的图像进行重建)
cv::Mat I, J, fullPart, localMax;
cv::morphologyEx(srcPrev - 1, J, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(_winSize, _winSize)));
cv::morphologyEx(cv::Mat(srcPrev - 1), J, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(_winSize, _winSize)));
//获取局部极大值部分
cv::subtract(J, srcPrev, I);
......@@ -8742,7 +8762,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
cv::morphologyEx(srcPrev, srcPrevEx, cv::MORPH_TOPHAT, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(winSize, winSize)));
//二值化元件区域
cv::Mat sinPartMask;
cv::threshold(srcPrevEx, sinPartMask, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
cv::threshold(srcPrevEx, sinPartMask, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);//
#ifdef VQISDA
//仅仅用于佳世达20220608
if (!spliceMask.empty())
......@@ -8763,9 +8783,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
//定位料盘中心
cv::findContours(srcPrevEx, contoursFilter, cv::RETR_TREE, cv::CHAIN_APPROX_NONE);
image = cv::Scalar(0);
for (int i = 0; i < contoursFilter.size(); i++)
for (int ii = 0; ii < contoursFilter.size(); ii++)
{
cv::drawContours(image, contoursFilter, i, cv::Scalar(255), -1);
cv::drawContours(image, contoursFilter, ii, cv::Scalar(255), -1);
}
image -= srcPrevEx;
//获取最大轮廓
......@@ -8801,8 +8821,8 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
//由于这里判断是小料不会出现大部分粘连的情况,所以这种情况只能是深色盘
if (cv::min(stat.ptr<int>(0)[cv::CC_STAT_WIDTH], stat.ptr<int>(0)[cv::CC_STAT_HEIGHT]) > 300)
{
//处理深色盘
cv::threshold(srcPrev, sinParts, getThreshVal_Otsu_8u_mask(srcPrev, sinParts), 255, cv::THRESH_BINARY);
//处理深色盘(//20230307修改(+15)台湾环宏修改,自认为深色盘增加这点阈值不构成影响故保留,未大量测试)
cv::threshold(srcPrev, sinParts, getThreshVal_Otsu_8u_mask(srcPrev, sinParts) + 15, 255, cv::THRESH_BINARY);
//重新计算元件面积,判断这些连通域相似性(从面积、平均灰度、最大灰度等判断)再确定阈值与面积过滤参数
cv::Mat __labels, __stats, __centroids;
int nccomps = cv::connectedComponentsWithStats(sinParts, __labels, __stats, __centroids);
......@@ -8851,6 +8871,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
std::sort(tMaps.begin(), tMaps.end(), std::less<tMap>());
//确定单个元件尺寸与灰度值
sinPartSize = cvRound(tMaps[0].te.Area);
std::cout << tMaps[0].te.Area << std::endl;
//20220803测试用:考虑到只有深色盘才能进到这里,可以作特殊处理(前提是料盘未散开,中心才能对)
#ifdef VQISDA
cv::Mat sinPartsEx;
......@@ -9000,9 +9021,169 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
cv::bitwise_and(spliceMask, lbImage, lbImage);
}
#endif // VQISDA
//粗略计数
cv::Mat labels, stats, centroids;
//针对台湾修改20230324
bool isTw = false; int extraNum = 0;
int nn = cv::connectedComponentsWithStats(lbImage, labels, stats, centroids);
//判断是否符合条件
for (int n = 1; n < nn; n++)
{
if (stats.ptr<int>(n)[cv::CC_STAT_AREA] == 1) {
extraNum++;
}
}
if ((float)extraNum / (float)nn > 0.5) {
isTw = true;
}
extraNum = 0;
if (/*isTw && (sinPartSize >= 6 && sinPartSize <= 9)*/false) {
cv::Mat mk;
nn = cv::connectedComponentsWithStats(sinParts, labels, stats, centroids);
//根据元件大小确定是否进行粘连处理
std::vector<uchar> colorsx(nn + 1, 0);
for (int ii = 1; ii < nn; ii++) {
colorsx[ii] = 0;
if (stats.ptr<int>(ii)[cv::CC_STAT_AREA] >= 1.6 * sinPartSize && (stats.ptr<int>(ii)[cv::CC_STAT_WIDTH] >= 6 || stats.ptr<int>(ii)[cv::CC_STAT_HEIGHT] >= 6))
{
cv::Rect rMask = cv::Rect(stats.ptr<int>(ii)[cv::CC_STAT_LEFT], stats.ptr<int>(ii)[cv::CC_STAT_TOP],
stats.ptr<int>(ii)[cv::CC_STAT_WIDTH], stats.ptr<int>(ii)[cv::CC_STAT_HEIGHT]);
cv::Mat mmMask = cv::Mat(labels(rMask) == ii).clone() & cv::Mat(lbImage(rMask).clone());
int numMax = cv::connectedComponents(mmMask, mk) - 1;
if (numMax <= 1) {
colorsx[ii] = 255;
}
}
}
cv::Mat multiSize(Y, X, CV_8UC1, cv::Scalar(0));
//认为是粘连
cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range& range)->void {
for (int y = range.start; y < range.end; y++)
{
for (int x = 0; x < X; x++)
{
int label = labels.ptr<int>(y)[x];
CV_Assert(0 <= label && label <= nn);
multiSize.ptr<uchar>(y)[x] = colorsx[label];
}
}
});
#pragma region discard
//int x_offset[8] = { -1, 0, 1, 1, 1, 0,-1,-1 };
//int y_offset[8] = { -1,-1,-1, 0, 1, 1, 1, 0 };
////
//cv::Mat mark0(Y, X, CV_8UC1, cv::Scalar(0));
//for (int n = 1; n < nn; n++)
//{
// //当只有一个峰值时
// if (stats.ptr<int>(n)[cv::CC_STAT_AREA] >= 1) {
// //
// cv::Point p(stats.ptr<int>(n)[cv::CC_STAT_LEFT], stats.ptr<int>(n)[cv::CC_STAT_TOP]);
// //待处理队列
// std::queue<cv::Point> que;
// que.push(p);
// //首先确定邻域阈值
// std::vector<uchar> t;
// t.push_back(srcPrev.ptr<uchar>(p.y)[p.x]);
// for (int np = 0; np < 8; np++)
// {
// int nx = p.x + x_offset[np];
// int ny = p.y + y_offset[np];
// //越界处理
// if (nx > X - 1) nx = X - 1;
// if (nx < 0) nx = 0;
// if (ny > Y - 1) ny = Y - 1;
// if (ny < 0) ny = 0;
// t.push_back(srcPrev.ptr<uchar>(ny)[nx]);
// }
// std::sort(t.rbegin(), t.rend());
// //
// int dist = t[0] - t[2];
// do
// {
// cv::Point q = que.front();
// que.pop();
// //
// if (q.x == 2257 && q.y == 2002) {
// std::cout << "" << std::endl;
// }
// //作标记处理
// mark0.ptr<uint8_t>(q.y)[q.x] = 255;
// //进行扩展处理
// int nx, ny; uint8_t val8 = srcPrev.ptr<uint8_t>(q.y)[q.x];
// for (int np = 0; np < 8; np++)
// {
// nx = q.x + x_offset[np];
// ny = q.y + y_offset[np];
// //越界处理
// if (nx > X - 1) nx = X - 1;
// if (nx < 0) nx = 0;
// if (ny > Y - 1) ny = Y - 1;
// if (ny < 0) ny = 0;
// //判断是否符合条件
// if (val8 - srcPrev.ptr<uint8_t>(ny)[nx] <= dist && mark0.ptr<uint8_t>(ny)[nx] != 255\
// &&sinParts.ptr<uint8_t>(ny)[nx] == 255) {
// //扩展标记
// newLabImage.ptr<uint8_t>(ny)[nx] = 255;
// //符合扩展条件的点
// que.push(cv::Point(nx, ny));
// }
// //标记为已处理
// mark0.ptr<uint8_t>(ny)[nx] = 255;
// }
// std::cout << "" << std::endl;
// } while (!que.empty());
// std::cout << "" << std::endl;
// }
// //else {
// // //重新确定最大值
// //}
//}
#pragma endregion
nn = cv::connectedComponentsWithStats(lbImage, labels, stats, centroids);
cv::Mat labels3, stats3, centroids3;
int nnn = cv::connectedComponentsWithStats(sinParts, labels3, stats3, centroids3);
std::vector<int> extraLabel;
for (int ij = 1; ij < nn; ij++)
{
if (stats.ptr<int>(ij)[cv::CC_STAT_WIDTH] >= 3 || stats.ptr<int>(ij)[cv::CC_STAT_HEIGHT] >= 3) {
//if (labels3.ptr<uint32_t>(stats.ptr<int>(ij)[cv::CC_STAT_TOP])[stats.ptr<int>(ij)[cv::CC_STAT_LEFT]]!=0) {
extraLabel.push_back(labels3.ptr<uint32_t>(stats.ptr<int>(ij)[cv::CC_STAT_TOP])[stats.ptr<int>(ij)[cv::CC_STAT_LEFT]]);
//}
}
}
//过滤
cv::Mat extraMap;
sinParts.copyTo(extraMap);
cv::parallel_for_(cv::Range(0, extraMap.rows), [&](const cv::Range& range)->void {
for (int y = range.start; y < range.end; y++)
{
uint32_t* ptrRow = m1.ptr<uint32_t>(y);
for (int x = 0; x < extraMap.cols; x++)
{
if (std::find(extraLabel.begin(), extraLabel.end(), ptrRow[x]) != extraLabel.end()) {
extraMap.ptr<uint8_t>(y)[x] = 0;
}
}
}
});
cv::bitwise_xor(extraMap, sinParts, extraMap);
//
cv::bitwise_or(multiSize, extraMap, multiSize);
//画图
std::vector<std::vector<cv::Point>> contoursExtra;
cv::findContours(multiSize, contoursExtra, cv::RETR_TREE, cv::CHAIN_APPROX_NONE);
for (int vc = 0; vc < contoursExtra.size(); vc++)
{
extraNum++;
cv::drawContours(cc, contoursExtra, vc, cv::Scalar(255, 0, 0, 255), -1);
cv::drawContours(cc, contoursExtra, vc, cv::Scalar(0, 0, 255, 255), 1);
}
std::cout << extraNum << std::endl;
}
int reelNum = cv::connectedComponentsWithStats(lbImage, labels, stats, centroids);
//清空
memset(pLabelImg, 0, X * Y * sizeof(unsigned char));
......@@ -9027,7 +9208,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
#ifdef NDEBUG
//结果信息
reelNum = (int)vLocations.size();
reelNum = (int)vLocations.size() + extraNum;
std::string text = std::to_string(i + 1) + ": Reel Number = ";
text += std::to_string(reelNum);
text += " ; PartSize = " + std::to_string(sinPartSize);
......@@ -9038,7 +9219,6 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char* fileName, in
//
trayNum[sortedTrays[i].iDir] = reelNum;
#endif
}
else
{
......@@ -12031,7 +12211,7 @@ int eyemTrackFeature(EyemImage tpImage, EyemImage tpMask, EyemRect tpRoi, EyemRe
for (int i = 1; i < nccomps; i++) {
colors[i] = 255;
double dArea = (double)stats.ptr<int>(i)[cv::CC_STAT_AREA];
if (dArea < 11000)
if (dArea < 5000)
{
colors[i] = 0;
}
......@@ -12101,7 +12281,6 @@ int eyemTrackFeature(EyemImage tpImage, EyemImage tpMask, EyemRect tpRoi, EyemRe
});
cv::addWeighted(cc, 0.7, transpMask, 0.3, 0, cc);
//<输出结果图像
tpDstImg->iWidth = cc.cols; tpDstImg->iHeight = cc.rows; tpDstImg->iDepth = cc.depth(); tpDstImg->iChannels = cc.channels();
//内存尺寸
......@@ -13139,7 +13318,6 @@ int eyemCalcReelTHK(EyemImage tpImage, EyemImage tpMask, EyemOcsIXY* ptResults,
cv::Mat stat;
largestConnectComponent(imageEx, stat);
//
std::vector<std::vector<cv::Point>> contours;
cv::findContours(imageEx, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
......@@ -13156,6 +13334,144 @@ int eyemCalcReelTHK(EyemImage tpImage, EyemImage tpMask, EyemOcsIXY* ptResults,
return FUNC_OK;
}
int eyemCkReelStatus(EyemImage tpImage, const char* lpszConfigPath, int& iStatus)
{
CV_Assert(NULL != tpImage.vpImage);
cv::Mat image = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage).clone();
if (image.empty())
return FUNC_IMAGE_NOT_EXIST;
if (image.channels() > 1) {
cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
}
//配置
if (NULL == lpszConfigPath) {
return FUNC_IMAGE_NOT_EXIST;
}
std::ifstream in(lpszConfigPath);
std::string line;
std::vector<std::string> config;
if (in) {
while (getline(in, line)) {
config.push_back(line);
}
}
else {
std::cout << "no such file: " << lpszConfigPath << std::endl;
exit(1);
}
//加载配置
std::map<std::string, std::string> dict;
for (int i = 0; i < config.size(); i++) {
// pass for empty line or comment
if (config[i].size() <= 1 || config[i][0] == '#') {
continue;
}
std::vector<std::string> res = split(config[i], " ");
dict[res[0]] = res[1];
}
std::string file = dict["ck_background_dir"];
if (file.empty()) {
return FUNC_IMAGE_NOT_EXIST;
}
cv::Mat src = cv::imread(file, cv::IMREAD_GRAYSCALE);
if (src.empty()) {
return FUNC_IMAGE_NOT_EXIST;
}
//检查图像尺寸是否一致
if (image.cols != src.cols || image.rows != src.rows || image.depth() != src.depth()) {
return FUNC_ILLEGAL_ARGUMENT;
}
//
cv::Rect rec = cv::Rect(atoi(dict["left"].c_str()), atoi(dict["top"].c_str()), atoi(dict["width"].c_str()), atoi(dict["height"].c_str()));
cv::Mat dst;
cv::absdiff(image(rec), src(rec), dst);
int thresh = atoi(dict["thresh"].c_str());
if (cv::mean(dst)[0] > thresh) {
iStatus = 1;
}
else {
iStatus = 0;
}
return FUNC_OK;
}
int eyemAchvRotateImage(EyemImage tpImage, EyemOcsIXY p1, EyemOcsIXY p2, EyemOcsIXY p3, EyemOcsIXY p4, EyemImage* tpDstImg)
{
CV_Assert(NULL != tpImage.vpImage);
cv::Mat image = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage).clone();
if (image.empty())
return FUNC_IMAGE_NOT_EXIST;
cv::Mat showResult, dst;
if (image.channels() >= 3) {
image.copyTo(showResult);
}
else {
cv::cvtColor(image, showResult, cv::COLOR_GRAY2BGR);
}
const int X = image.cols, Y = image.rows;
//最小外接矩形
cv::Rect _rr(cvFloor(std::min(std::min(std::min(p1.iX, p2.iX), p3.iX), p4.iX)),
cvFloor(std::min(std::min(std::min(p1.iY, p2.iY), p3.iY), p4.iY)),
cvCeil(std::max(std::max(std::max(p1.iX, p2.iX), p3.iX), p4.iX)),
cvCeil(std::max(std::max(std::max(p1.iY, p2.iY), p3.iY), p4.iY))); _rr.width -= _rr.x - 1; _rr.height -= _rr.y - 1;
cv::rectangle(showResult, _rr, cv::Scalar(0, 255, 0), 1);
//计算角度
cv::Point2f diff = cv::Point2f(p1.iX, p1.iY) - cv::Point2f(p2.iX, p2.iY);
int dist1 = cv::sqrt(diff.x * diff.x + diff.y * diff.y);
diff = cv::Point2f(p2.iX, p2.iY) - cv::Point2f(p3.iX, p3.iY);
int dist2 = cv::sqrt(diff.x * diff.x + diff.y * diff.y);
float angle;
if (dist1 > dist2) {
angle = atan2((p2.iY + p3.iY) / 2 - (p1.iY + p4.iY) / 2, (p2.iX + p3.iX) / 2 - (p1.iX + p4.iX) / 2) * 180 / PI;
}
else {
angle = atan2((p1.iY + p2.iY) / 2 - (p3.iY + p4.iY) / 2, (p1.iX + p2.iX) / 2 - (p3.iX + p4.iX) / 2) * 180 / PI;
}
//计算旋转后的点
cv::Rect rr = cv::Rect(_rr.x - 50, _rr.y - 50, _rr.width + 100, _rr.height + 100) & cv::Rect(0, 0, X, Y);
cv::Mat input = image(rr).clone();
float matx[6];
cv::Mat det = getTrackMat(input, angle, 0, matx);
std::vector<cv::Point2f> _pts = { cv::Point2f(p1.iX,p1.iY),cv::Point2f(p2.iX,p2.iY) ,cv::Point2f(p3.iX,p3.iY) ,cv::Point2f(p4.iX,p4.iY) };
cv::Point2f __pts[4];
for (int j = 0; j < 4; j++)
{
__pts[j].x = matx[0] * (_pts[j].x - (float)rr.x) + matx[1] * (_pts[j].y - (float)rr.y) + matx[2];
__pts[j].y = matx[3] * (_pts[j].x - (float)rr.x) + matx[4] * (_pts[j].y - (float)rr.y) + matx[5];
}
//
std::vector<cv::Point2f> pts(std::begin(__pts), std::end(__pts));
cv::Rect dstR = cv::boundingRect(pts);
//画图
det.copyTo(showResult);
//for (int j = 0; j < 4; j++)
//{
// cv::line(showResult, pts[j], pts[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
//}
//输出
cv::Rect detR = cv::Rect(dstR.x - 25, dstR.y - 25, dstR.width + 50, dstR.height + 50);
dst = showResult(detR).clone();
//<输出结果图像
tpDstImg->iWidth = dst.cols; tpDstImg->iHeight = dst.rows; tpDstImg->iDepth = dst.depth(); tpDstImg->iChannels = dst.channels();
//内存尺寸
int _Size = tpDstImg->iWidth * tpDstImg->iHeight * tpDstImg->iChannels * sizeof(uint8_t);
//分配初始化内存
tpDstImg->vpImage = (uint8_t*)malloc(_Size);
if (NULL == tpDstImg->vpImage)
return FUNC_NOT_ENOUGH_MEM;
memset(tpDstImg->vpImage, 0, _Size);
//拷贝数据
memcpy(tpDstImg->vpImage, dst.data, _Size);
}
#ifdef _V455
int eyemInitCounter(const char* extractorModelPath)
{
......@@ -13244,7 +13560,6 @@ static void cv_tbb_parallel_impl()
});
}
static void thresholdC(cv::Mat& image, EyemHSVModel& tpHSVModel, cv::Mat& dst)
{
const int X = image.cols, Y = image.rows;
......@@ -13343,7 +13658,7 @@ static void rotateTransorm(cv::Mat& image, cv::Point tpCenter, double angle)
bool mouseDown = false;
cv::Point sp(-1, -1), ep(-1, -1);
EyemOcsDXY tpPt1St, tpPt1Ed, tpPt2St, tpPt2Ed;
static void mouse_callback(int event, int x, int y, int flags, void* userdata)
static void onMouse(int event, int x, int y, int flags, void* userdata)
{
cv::Mat image = *((cv::Mat*)userdata);
cv::Mat showResult;
......@@ -13392,7 +13707,7 @@ static void mouse_callback(int event, int x, int y, int flags, void* userdata)
}
#include "eyemStopwatch.h"
int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
int eyemLibImpl(EyemImage tpImage, const char* fileName, EyemImage* tpDstImg)
{
CV_Assert(NULL != tpImage.vpImage);
cv::Mat image = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage).clone();
......@@ -13401,13 +13716,50 @@ int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
const int X = image.cols, Y = image.rows;
cv::Mat showResult;
cv::Mat showResult, imageGray;
image.copyTo(showResult);
cv::namedWindow("Test", cv::WINDOW_AUTOSIZE);
cv::setMouseCallback("Test", mouse_callback, (void*)(&showResult));
cv::waitKey(0);
getTplMat(image, 45, 0);
return FUNC_OK;
//cv::cvtColor(image, imageGray, cv::COLOR_BGR2GRAY);
////cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
//std::vector<cv::Mat> images;
//cv::split(image, images);
//images[0].copyTo(image);
//cv::GaussianBlur(image, image, cv::Size(9, 9), 0.5, 0.5);
//cv::Mat mask = cv::Mat::zeros(cv::Size(X, Y), CV_8UC1);
//cv::Rect rec = cv::Rect(894, 868, 1255, 1273);
//cv::rectangle(mask, rec, cv::Scalar(255), -1);
//cv::Mat bin0, bin1, bin;
//cv::threshold(image, bin0, getThreshVal_Otsu_8u_mask(image, mask) + 55, 255, cv::THRESH_BINARY);
//bin0.copyTo(bin, mask);
//cv::bitwise_not(mask, mask);
//cv::threshold(image, bin1, getThreshVal_Otsu_8u_mask(image, mask) + 15, 255, cv::THRESH_BINARY);
//bin1.copyTo(bin, mask);
//cv::Mat imageEx;
//cv::morphologyEx(bin, imageEx, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9)));
//cv::imwrite("cc.png", imageEx);
//cv::adaptiveThreshold(image, imageEx, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 9, 0.5);
//return FUNC_OK;
//cv::namedWindow("Test", cv::WINDOW_AUTOSIZE);
//cv::setMouseCallback("Test", onMouse, (void*)(&showResult));
//cv::waitKey(0);
//return FUNC_OK;
#pragma region 七巧板定位
......@@ -13714,9 +14066,9 @@ int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
// }
//}
#pragma endregion
cv::waitKey(0);
cv::destroyAllWindows();
return FUNC_OK;
//cv::waitKey(0);
//cv::destroyAllWindows();
//return FUNC_OK;
#pragma region 插件机AOI检测
//cv::Mat imageGray;
......@@ -13901,19 +14253,7 @@ int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
//net_.setPreferableBackend(cv::dnn::Backend::DNN_BACKEND_OPENCV);
//net_.setPreferableTarget(cv::dnn::Target::DNN_TARGET_CPU);
////转float类型
//cv::Mat input;
//image.convertTo(input, CV_32F, 1 / 255.);
//cv::imwrite("resul2.png", showResult);
Stopwatch sw;
sw.Start();
//AZONNXWrapper azx;
//azx.init("D://last_ckpt.onnx");
//azx.setInputParams(0.15, 0.15, 200);
//azx.forward(image);
//return 0;
#ifdef _V455 此版本的onnx仅支持4.5.1以上的opencv版本
#ifndef YOLACT
......@@ -13927,13 +14267,17 @@ int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
azx.forward(image);
return 0;
#else
//AZONNXWrapper azx;
//azx.init("D://yolact_base_1249_45000.onnx");
//azx.setInputParams(0.15, 0.15, 200);
AZONNXWrapper azx;
azx.init("D://yolact_base_1421_54000.onnx");
azx.setInputParams(0.15, 0.15, 200);
//cv::Mat labels, stats;
//azx.forward(image, labels, stats, showResult, cv::Scalar(123.68, 116.78, 103.94), cv::Scalar(58.40, 57.12, 57.38));
//return 0;
Stopwatch sw;
sw.Start();
cv::Mat labels, stats;
azx.forward(image, labels, cv::Scalar(123.68, 116.78, 103.94), cv::Scalar(58.40, 57.12, 57.38));
sw.Stop();
std::cout << "t=" << sw.ElapsedMilliseconds() << std::endl;
return 0;
#endif // (defined YOLACT && YOLACT==false)
#else //resnet18提取特征向量
AZONNXWrapper az;
......@@ -13941,7 +14285,7 @@ int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
float* predicts = az.forward(image, cv::Scalar(), cv::Scalar());
for (int i = 0; i < 512; i++) {
std::cout << predicts[i] << std::endl;
}
}
#endif // _V455
//auto mask = pSegtor->extract(image);
......@@ -15780,19 +16124,19 @@ int eyemLibImpl(EyemImage tpImage, EyemImage* tpDstImg)
#pragma endregion
sw.Stop();
std::cout << "时间花费:" << sw.ElapsedMilliseconds() << std::endl;
//<输出结果图像
tpDstImg->iWidth = showResult.cols; tpDstImg->iHeight = showResult.rows; tpDstImg->iDepth = showResult.depth(); tpDstImg->iChannels = showResult.channels();
//内存尺寸
int _Size = tpDstImg->iWidth * tpDstImg->iHeight * tpDstImg->iChannels * sizeof(uint8_t);
//分配初始化内存
tpDstImg->vpImage = (uint8_t*)malloc(_Size);
if (NULL == tpDstImg->vpImage)
return FUNC_NOT_ENOUGH_MEM;
memset(tpDstImg->vpImage, 0, _Size);
//拷贝数据
memcpy(tpDstImg->vpImage, showResult.data, _Size);
//sw.Stop();
//std::cout << "时间花费:" << sw.ElapsedMilliseconds() << std::endl;
////<输出结果图像
//tpDstImg->iWidth = showResult.cols; tpDstImg->iHeight = showResult.rows; tpDstImg->iDepth = showResult.depth(); tpDstImg->iChannels = showResult.channels();
////内存尺寸
//int _Size = tpDstImg->iWidth * tpDstImg->iHeight * tpDstImg->iChannels * sizeof(uint8_t);
////分配初始化内存
//tpDstImg->vpImage = (uint8_t*)malloc(_Size);
//if (NULL == tpDstImg->vpImage)
// return FUNC_NOT_ENOUGH_MEM;
//memset(tpDstImg->vpImage, 0, _Size);
////拷贝数据
//memcpy(tpDstImg->vpImage, showResult.data, _Size);
return FUNC_OK;
}
......
......@@ -7,6 +7,7 @@
#include <numeric>
#include <tbb\tbb.h>
#include <queue>
#include "eyemLib.h"
#include "azONNXWrapper.h"
......
......@@ -6,6 +6,8 @@ public:
~Impl() {}
//目标检测
std::vector<cv::Rect> detect(const cv::Mat& img);
//实例分割器
void instance(const cv::Mat& img, cv::Mat& dst);
//目标检测器
#ifdef _V455
std::shared_ptr<AZONNXWrapper> detector_;
......@@ -70,6 +72,19 @@ std::vector<cv::Rect> NNDetector::Impl::detect(const cv::Mat& img) {
#endif
}
void NNDetector::instance(cv::InputArray img, cv::Mat& dst) {
p->instance(img.getMat(), dst);
}
void NNDetector::Impl::instance(const cv::Mat& img, cv::Mat& dst) {
#ifdef _V455
detector_->setInputParams(_fConfidence, _fNMSThreshold, 550);
cv::Mat input;
img.copyTo(input);
detector_->forward(input, dst, cv::Scalar(123.68, 116.78, 103.94), cv::Scalar(58.40, 57.12, 57.38));
#endif
}
int eyemInitNNDetector(const char* detectorConfigPath, const char* detectorModelPath, int iNetSizew, int iNetSizeh)
{
try {
......@@ -138,6 +153,140 @@ int eyemNNDetector(EyemImage tpImage, int* ipNum, BboxContainer& container, Eyem
return FUNC_OK;
}
int eyemNNInstanceSegment(EyemImage tpImage, float fThreshold, RotateBox& container, EyemImage* tpDstImg)
{
cv::Mat src = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage).clone();
if (src.empty()) {
return FUNC_IMAGE_NOT_EXIST;
}
//
if (src.channels() > 3) {
cv::cvtColor(src, src, cv::COLOR_BGRA2BGR);
}
//如果不满足尺寸给补齐
if (src.cols != 5472 || src.rows != 3648) {
cv::Mat temp;
cv::copyMakeBorder(src, temp, 0, 5472 - src.cols, 0, 5472 - src.rows, cv::BORDER_REPLICATE);
src = temp(cv::Rect(0, 0, 5472, 3648)).clone();
}
//画图
cv::Mat showResult;
if (src.channels() <= 1) {
cv::cvtColor(src, showResult, cv::COLOR_GRAY2BGR);
}
else {
src.copyTo(showResult);
}
cv::Mat transpMask;
showResult.copyTo(transpMask);
//
cv::Mat input;
cv::resize(src, input, cv::Size(1024, 683));
try
{
//
float factorX = 5472 / 1024, factorY = 3648 / 683;
cv::Mat dst;
pNNDetector->instance(input, dst);
//恢复真实尺度
cv::resize(dst, dst, cv::Size(5472, 3648));
//
cv::Mat label;
cv::threshold(dst, label, 190, 255, cv::THRESH_BINARY);
//判断矩形
std::vector<std::vector<cv::Point>> contours;
findContours(label, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
//多边形拟合
std::vector<std::vector<cv::Point>> poly(contours.size()); std::vector<std::vector<cv::Point2f>> rotateBoxes;
for (int i = 0; i < contours.size(); i++)
{
if (cv::contourArea(contours[i]) > cvRound(180000 * fThreshold)) {
cv::approxPolyDP(cv::Mat(contours[i]), poly[i], cv::arcLength(contours[i], true) * 0.03, true);
//最小外包矩形
cv::RotatedRect rRect;
cv::Point2f pts[4];
rRect = cv::minAreaRect(poly[i]);
rRect.points(pts);
//
cv::Rect bbox = cv::boundingRect(contours[i]);
//计算矩形度
cv::Mat mask(cv::Size(bbox.width, bbox.height), CV_8UC1, cv::Scalar(0));
std::vector<std::vector<cv::Point>> tmpContours;
std::vector<cv::Point> border;
for (int n = 0; n < 4; n++)
{
border.push_back(pts[n]);
}
tmpContours.push_back(border);
//
cv::drawContours(mask, tmpContours, 0, cv::Scalar(255), -1, 8, cv::noArray(), 2147483647, cv::Point(-bbox.tl()));
cv::Mat mask0;
label(bbox).copyTo(mask0);
//计算有效区域
cv::bitwise_and(mask0, mask, mask);
if ((float)cv::countNonZero(mask) / rRect.size.area() > fThreshold) {
//绘制
std::vector<cv::Point2f> rotateBox;
for (int j = 0; j < 4; j++)
{
rotateBox.push_back(pts[j]);
cv::line(showResult, pts[j], pts[(j + 1) % 4], cv::Scalar(0, 255, 255), 3);
}
rotateBoxes.push_back(rotateBox);
std::cout << (float)cv::countNonZero(mask) / rRect.size.area() << std::endl;
cv::drawContours(showResult, poly, i, cv::Scalar(0, 0, 255), 3);
}
else {
cv::drawContours(label, contours, i, cv::Scalar(0, 0, 0), -1);
}
}
else {
cv::drawContours(label, contours, i, cv::Scalar(0, 0, 0), -1);
}
}
memset(&container, 0, sizeof(RotateBox));
//结果
for (int i = 0; i < rotateBoxes.size() && i < 100; ++i) {
container.p1[i].iX = cvRound(rotateBoxes[i][0].x), container.p1[i].iY = cvRound(rotateBoxes[i][0].y);
container.p2[i].iX = cvRound(rotateBoxes[i][1].x), container.p2[i].iY = cvRound(rotateBoxes[i][1].y);
container.p3[i].iX = cvRound(rotateBoxes[i][2].x), container.p3[i].iY = cvRound(rotateBoxes[i][2].y);
container.p4[i].iX = cvRound(rotateBoxes[i][3].x), container.p4[i].iY = cvRound(rotateBoxes[i][3].y);
}
//绘制mask
cv::parallel_for_(cv::Range(0, label.rows), [&](const cv::Range range)->void {
for (int y = range.start; y < range.end; y++)
{
for (int x = 0; x < label.cols; x++)
{
if (label.ptr<uint8_t>(y)[x] == 255) {
transpMask.ptr<cv::Vec3b>(y)[x] = cv::Vec3b(255, 255, 0);
}
}
}
});
cv::addWeighted(showResult, 0.7, transpMask, 0.3, 0, showResult);
}
catch (...)
{
return FUNC_ILLEGAL_ARGUMENT;
}
//<输出计数结果标记图像
tpDstImg->iWidth = showResult.cols; tpDstImg->iHeight = showResult.rows; tpDstImg->iDepth = showResult.depth(); tpDstImg->iChannels = showResult.channels();
//内存尺寸
int _Size = tpDstImg->iWidth * tpDstImg->iHeight * tpDstImg->iChannels * sizeof(uint8_t);
//分配初始化内存
tpDstImg->vpImage = (uint8_t*)malloc(_Size);
if (NULL == tpDstImg->vpImage)
return FUNC_NOT_ENOUGH_MEM;
memset(tpDstImg->vpImage, 0, _Size);
//拷贝数据
memcpy(tpDstImg->vpImage, showResult.data, _Size);
return FUNC_OK;
}
#ifdef _DEBUG
//int eyemInitClassifier(const char *classifierConfigPath, const char *classifierModelPath, int ntype)
//{
......
......@@ -20,7 +20,7 @@ public:
//ü
void setInputParams(float fConfidence, float fNMSThreshold);
std::vector<cv::Rect> detect(cv::InputArray img);
void instance(cv::InputArray img, cv::Mat& dst);
protected:
class Impl;
cv::Ptr<Impl> p;
......
......@@ -380,7 +380,7 @@ int eyemNonLocalMeansFilter(EyemImage tpImage, int iCMPSize, int iSearchSize, do
return FUNC_IMAGE_NOT_EXIST;
}
cv::Mat dest;
nonLocalMeansFilter_SSE(image, dest, cv::Size(3, 3), cv::Size(3, 3), 5.0, -1, 0);
nonLocalMeansFilter_SSE(image, dest, cv::Size(5, 5), cv::Size(5, 5), 25.0, 5, 0);
return FUNC_OK;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!