Commit ee8a6917 张士柳

1 个父辈 c34cb244
......@@ -2,7 +2,6 @@
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Linq;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
......@@ -1007,18 +1006,18 @@ namespace eyemLib_Sharp
EyemRect tpRoi = new EyemRect();
tpRoi.iXs = 200; tpRoi.iYs = 200;
tpRoi.iWidth = image.iWidth - 400;
tpRoi.iHeight = image.iHeight - 400;
tpRoi.iXs = 50; tpRoi.iYs = 50;
tpRoi.iWidth = image.iWidth - 100;
tpRoi.iHeight = image.iHeight - 100;
//
string pNumObj = "";
string file = fileName.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries)[2];
//获取用于制作模板的图像
flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
//flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//if (bitmap != null)
//{
......@@ -1034,28 +1033,28 @@ namespace eyemLib_Sharp
//double matchDeg = 0.80;
//flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//加载模板到内存
IntPtr hModelID = IntPtr.Zero;
////加载模板到内存
//IntPtr hModelID = IntPtr.Zero;
flag = eyemInitModel("D:\\模板文件", out hModelID);
//flag = eyemInitModel("D:\\模板文件", out hModelID);
string selectModel = "";
flag = eyemMatchTemplateModel(tpDstImg, hModelID, ref selectModel);
//string selectModel = "";
//flag = eyemMatchTemplateModel(tpDstImg, hModelID, ref selectModel);
//插入模板
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);
//string[] tpModels = selectModel.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (tpModels.Length <= 0)
{
logcpp.WriteLog("选择模板少于0");
return;
}
//if (tpModels.Length <= 0)
//{
// logcpp.WriteLog("选择模板少于0");
// return;
//}
//根据名称获取模板
EyemModelID tpModelID = new EyemModelID();
eyemAchvModelByName(tpModels[0], hModelID, ref tpModelID);
////根据名称获取模板
//EyemModelID tpModelID = new EyemModelID();
//eyemAchvModelByName(tpModels[0], hModelID, ref tpModelID);
//EyemImage tpModeImg = new EyemImage();
//tpModeImg.iChannels = 1; tpModeImg.iDepth = 0;
......@@ -1069,24 +1068,24 @@ namespace eyemLib_Sharp
//}
//最好释放掉,如果对象供其他接口使用要先释放
eyemImageFree(ref tpDstImg);
//eyemImageFree(ref tpDstImg);
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS",""
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), 35, 0, 100, 5, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), 0.1, "IP_LARGE_PARTS", 100, 7, ref pNumObj, out tpDstImg);
//eyemCountObjectE(image, tpRoi, fileName, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), tpModels[0], hModelID, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), 0.1, "", 100, 7, ref pNumObj, out tpDstImg);
eyemCountObjectE(image, tpRoi, fileName, 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);
//移除模板
flag = eyemRemoveModelByName(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
//flag = eyemRemoveModelByName(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
//Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//if (bitmap != null)
//{
// bitmap.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
//}
if (bitmap != null)
{
bitmap.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
}
////<解码测试
//int ipNum; EyemBarCode* tpResults;
......@@ -1100,10 +1099,10 @@ namespace eyemLib_Sharp
//hObject.Dispose();
sw.Stop();
Console.WriteLine("耗时:" + sw.ElapsedMilliseconds.ToString() + ",结果:" + pNumObj);
Console.WriteLine(file + "--->" + "耗时:" + sw.ElapsedMilliseconds.ToString() + ",结果:" + pNumObj);
//在关闭程序时释放
eyemReleaseModel(ref hModelID);
//eyemReleaseModel(ref hModelID);
//free image
eyemImageFree(ref tpDstImg);
eyemImageFree(ref image);
......
......@@ -17,10 +17,10 @@ namespace eyemLib_Sharp
}
//初始化
EyemLib.Init();
//EyemLib.Init();
string[] fileNames = Directory.GetFiles(@"D:\批量测试图像\", "*.*", SearchOption.AllDirectories);
for (int j = 0; j < 1250; j++)
for (int j = 0; j < 1; j++)
{
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 1;
......@@ -69,7 +69,7 @@ namespace eyemLib_Sharp
//EyemLib.eyemReleaseModelE(ref hModelID);
EyemLib.Free();
//EyemLib.Free();
Console.Write("请按任意键继续。。。");
Console.ReadKey();
......
......@@ -3166,9 +3166,56 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
//普通算法不做其他处理
else
{
//二值化
//先用自动算法点,如果不行判断为散料
LPSTR trayNum = "";
int iRet = eyemCountObjectE(tpImage, tpRoi, "", &trayNum, tpDstImg);
if (iRet == FUNC_OK) {
cv::Mat showCC = cv::Mat(tpDstImg->iHeight, tpDstImg->iWidth, MAKETYPE(tpDstImg->iDepth, tpDstImg->iChannels), tpDstImg->vpImage);
std::vector<std::string> trayNums;
split(trayNum, ",", trayNums);
//输出结果
std::string tTrayNum = "";
for (int i = 0; i < 4; i++)
{
if (trayNums[i] != "0")
{
//输出结果
tTrayNum = trayNums[i];
break;
}
}
*lpszNumObj = (char *)CoTaskMemAlloc(tTrayNum.size() + 1);
if (NULL != lpszNumObj)
{
strcpy(*lpszNumObj, tTrayNum.c_str());
}
//获取当前运行目录
char buf[128];
_getcwd(buf, sizeof(buf));
////不存在则创建
std::string filePath(buf);
filePath += "\\ResOut";
if (_access(filePath.c_str(), 0) == -1)
_mkdir(filePath.c_str());
//格式化文件名
char file[256];
sprintf_s(file, "%s\\%s-Mark.png", filePath.c_str(), fileName);
cv::imwrite(file, showCC);
return FUNC_OK;
}
else {
//行判断为散料
cv::threshold(srcPrev, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
cv::morphologyEx(binary, binary, cv::MORPH_CLOSE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(75, 75)));
cv::morphologyEx(binary, binary, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(75, 75)));
//计算直方图
int hist[256];
for (int y = 0; y < 256; y++) hist[y] = 0;
......@@ -3184,26 +3231,68 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
cv::threshold(srcPrev, binary, Otsu(hist), 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point>> contours, contourFilter;
//连接在一起(散料用)
cv::Mat binaryEx;
cv::morphologyEx(binary, binaryEx, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(75, 75)));
//掩膜
cv::Mat mask(Y, X, CV_8UC1, cv::Scalar(0));
cv::findContours(binaryEx, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
for (int i = 0; i < contours.size(); i++)
{
double contourArea = cv::contourArea(contours[i]);
if (contourArea > 15000)
{
////去掉中间部分
//cv::Moments mu = cv::moments(contours[i]);
//cv::Point2f reelCenter(float(mu.m10 / mu.m00), float(mu.m01 / mu.m00));
////标记当前位置
//cv::drawMarker(cc, reelCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 15);
//绘制掩膜
cv::drawContours(mask, contours, i, cv::Scalar(255), -1);
}
}
//粗略计数
cv::Mat labels, stats, centroids;
int numObj = cv::connectedComponentsWithStats(binary, labels, stats, centroids);
int numObj = cv::connectedComponentsWithStats(binary&mask, labels, stats, centroids);
//坐标图
binary = cv::Scalar(0);
//画图
double *dpCent = (double *)centroids.data;
for (int j = 1; j < numObj; j++)
{
//面积过滤
if (stats.ptr<int>(j)[cv::CC_STAT_AREA] > 2) {
binary.at<uchar>(cv::Point(cvRound((float)dpCent[(0) + (j) * 2]), cvRound((float)dpCent[(1) + (j) * 2]))) = 255;
}
}
}
}
//计数
std::vector<cv::Point> vLocations;
cv::findNonZero(binary, vLocations);
//画图
if ((strcmp(ccSubType, "") == 0) | (strcmp(ccSubType, "IP_SMALL_PARTS") == 0))
{
for (int c = 0; c < vLocations.size(); c++)
{
cv::circle(cc, vLocations[c], 1, cv::Scalar(0, 255, 0, 255), 1);
}
}
std::string trayNum = std::to_string(vLocations.size());
//画图显示
std::string text = "Reel Number = " + trayNum;
cv::putText(cc, text, cv::Point(35, 35), 0, 1.0, cv::Scalar(0, 140, 255, 255), 2);
//输出结果
*lpszNumObj = (char *)CoTaskMemAlloc(trayNum.size());
if (NULL != lpszNumObj)
......@@ -3756,6 +3845,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
return dMatchDeg > te.dMatchDeg;
}
};
//扫描步长
const double dMinorStep = 0.1;
//追踪长宽
......@@ -3767,9 +3857,10 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
//偏移角度(元件尺寸)
const double dOffset = (2 * asin(2 * trackLength / (2 * startRadius))) * 180 / PI;
//偏移角度(元件间距)
const double dScanRange = 15;
//追踪元件间距(弦长,可以尽量避免因个别器件偏离导致的追踪中断)
const double dScanRange = 15;//默认15°范围内一定有第二个料
//追踪元件间距(弦长,可以尽量避免因个别器件偏离导致的追踪中断,只需要计算一次?)
double dChordL = .0;
if (true) {
for (double t = startAngle + dOffset / 1.5; t < startAngle + dOffset / 1.5 + dScanRange; t += dMinorStep)
{
float x = float(reelCenter.x + startRadius*cos(t*c));
......@@ -3788,6 +3879,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
{
if ((sinParts.data)[(it.pos().x) + (it.pos().y)*X] == 255)
{
//cv::drawMarker(cc, cv::Point(x, y), cv::Scalar(0, 0, 255, 255), 0, 10);
//计算元件间距(弦长)
dChordL = 2.0 * startRadius*sin(((2.0 * asin((cv::norm(startCenter - cv::Point2f(x, y))) / (2.0 * startRadius))) * 180.0 / PI - dOffset / 2.0)*PI / 180.0 / 2.0);
break;
......@@ -3796,6 +3888,8 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
if (dChordL > 0)
break;
}
}
//并行处理
//#pragma omp parallel sections
{
......@@ -3859,8 +3953,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
trackEndPos = vParts[vParts.size() / 2];
//灰度极值认为是元件
std::sort(vParts.begin(), vParts.end(), std::greater<Track>());
//更新位置
//更新位置---修改为理论中点-20210416
trackCenter = cv::Point(vParts[0].Pos.x, vParts[0].Pos.y);
//trackCenter = cv::Point(trackEndPos.Pos.x, trackEndPos.Pos.y);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//纵向扫描
......@@ -4037,8 +4132,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
trackEndPos = vParts[vParts.size() / 2];
//灰度极值认为是元件
std::sort(vParts.begin(), vParts.end(), std::greater<Track>());
//更新位置
//更新位置---修改为理论中点-20210416
trackCenter = cv::Point(vParts[0].Pos.x, vParts[0].Pos.y);
//trackCenter = cv::Point(trackEndPos.Pos.x, trackEndPos.Pos.y);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//纵向扫描
......@@ -4890,7 +4986,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
#endif
//判断是否追踪终止(增加匹配分数小于0.18被判定不是元件)
if (trayEnd || maxyyu < 0.15) {
if (trayEnd) {
//不再判断,大概率已经终止
found = false;
}
......@@ -5056,7 +5152,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
#endif
//判断是否追踪终止(增加匹配分数小于0.18被判定不是元件)
if (trayEnd || maxyyu < 0.15) {
if (trayEnd) {
//不再判断,大概率已经终止
found = false;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!