Commit c13fd1b2 张士柳

1 个父辈 d448a6d4
......@@ -1301,7 +1301,7 @@ namespace eyemLib_Sharp
//tpHsvModel.dpRangeL = new double[] { 100, 43, 46 }; tpHsvModel.dpRangeU = new double[] { 124, 255, 255 };
//tpHsvModel.dpRangeLExt = new double[] { 0, 0, 0 }; tpHsvModel.dpRangeUExt = new double[] { 0, 0, 0 };
//eyemClassifier(image);
//flag = eyemLibImpl(image, out tpDstImg);
flag = eyemLibImpl(image, out tpDstImg);
//float[] fFeatures = new float[512];
//eyemExtractWithONNX(image, fFeatures);
//string ftrs = string.Join(" ", fFeatures).Trim();
......@@ -1322,9 +1322,9 @@ namespace eyemLib_Sharp
// bitmap.Save("D:\\ResOut\\" + file);
//}
//eyemImageFree(ref tpMatchImg);
//eyemImageFree(ref tpDstImg);
//eyemImageFree(ref image);
//return;
eyemImageFree(ref tpDstImg);
eyemImageFree(ref image);
return;
//EyemImage templ, search;
//flag = eyemImageRead("D://批量测试图像//template.png", -1, out templ);
......@@ -1540,10 +1540,10 @@ namespace eyemLib_Sharp
#endregion
EyemRect tpRoi = new EyemRect();
tpRoi.iXs = 200; tpRoi.iYs = 200;
tpRoi.iWidth = image.iWidth - 400;
tpRoi.iHeight = image.iHeight - 400;
flag = eyemAchvMatchMat(image, tpRoi, out tpDstImg);
tpRoi.iXs = 50; tpRoi.iYs = 50;
tpRoi.iWidth = image.iWidth - 100;
tpRoi.iHeight = image.iHeight - 100;
//flag = eyemAchvMatchMat(image, tpRoi, out tpDstImg);
//EyemOcsDXYR tpCircle = new EyemOcsDXYR();
//EyemRect limRoi = new EyemRect();
//limRoi.iXs = 222; limRoi.iYs = 222;
......@@ -1558,7 +1558,7 @@ namespace eyemLib_Sharp
//}
//eyemImageFree(ref tpDstImg);
//eyemImageFree(ref image);
return;
//return;
//获取用于制作模板的图像
//flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
......@@ -1618,13 +1618,12 @@ namespace eyemLib_Sharp
int[] ipReelNum = new int[4];
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS",,IP_SQUARE_PARTS
//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);
eyemCountObjectIrregularParts(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);
//移除模板
//flag = eyemRemoveModelByName(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
if (bitmap != null)
{
......
此文件类型无法预览
......@@ -4128,7 +4128,7 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
else if (strcmp(ccSubType, "IP_SQUARE_PARTS") == 0)
{
//测试用,对于个别元件需要稍微膨胀一下
//对于个别元件需要稍微膨胀一下
cv::morphologyEx(srcPrev, srcPrev, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 2)));
//二值化
cv::threshold(srcPrev, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
......@@ -4146,13 +4146,15 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
cv::threshold(srcPrev, binary, Otsu(hist_), 255, cv::THRESH_BINARY);
//主要用于计算数量
cv::Mat binary4Count = binary.clone();
//计算元件大小
cv::Mat m1, m2, m3;
int nccomps = cv::connectedComponentsWithStats(binary, m1, m2, m3);
std::vector<uchar> colors0(nccomps + 1, 0);
for (int i = 1; i < nccomps; i++) {
colors0[i] = 255;
if ((((int *)m2.data)[(cv::CC_STAT_AREA) + (i)*m2.cols] <= 21) || m2.ptr<int>(i)[cv::CC_STAT_WIDTH] * m2.ptr<int>(i)[cv::CC_STAT_HEIGHT] > 400000)//经验值
if ((((int *)m2.data)[(cv::CC_STAT_AREA) + (i)*m2.cols] <= 31) || m2.ptr<int>(i)[cv::CC_STAT_WIDTH] * m2.ptr<int>(i)[cv::CC_STAT_HEIGHT] > 400000)//经验值
{
colors0[i] = 0;
}
......@@ -4212,18 +4214,76 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
std::sort(tVector.begin(), tVector.end(), std::greater<tMap>());
if (tVector.size() < 2)
{
return false;
return FUNC_CANNOT_CALC;
}
//单个元件面积
int sinPartSize = cvRound((tVector[0].Key + tVector[1].Key) / 2.);
//根据单个元件面积过滤
nccomps = cv::connectedComponentsWithStats(binary4Count, m1, m2, m3);
std::vector<uchar> colors(nccomps + 1, 0);
for (int i = 1; i < nccomps; i++) {
colors[i] = 255;
if ((((int *)m2.data)[(cv::CC_STAT_AREA) + (i)*m2.cols] >= 1.35*sinPartSize) || (((int *)m2.data)[(cv::CC_STAT_AREA) + (i)*m2.cols] < 0.45*sinPartSize))//经验值
if ((((int *)m2.data)[(cv::CC_STAT_AREA) + (i)*m2.cols] > 400000) || (((int *)m2.data)[(cv::CC_STAT_AREA) + (i)*m2.cols] < 0.45*sinPartSize))//经验值
{
colors[i] = 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 = ((int *)m1.data)[(x)+(y)*m1.cols];
CV_Assert(0 <= label && label <= nccomps);
(binary4Count.data)[(x)+(y)*X] = colors0[label];
}
}
});
//膨胀
cv::morphologyEx(binary4Count, binary4Count, cv::MORPH_CLOSE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)));
//计数
nccomps = cv::connectedComponentsWithStats(binary4Count, m1, m2, m3);
//考虑重新计算元件尺寸
std::vector<int> vHist2(nccomps);
for (int y = 0; y < Y; y++)
{
int *uPtr = (int *)m1.data + y * X;
for (int x = 0; x < X; x++, uPtr++) {
vHist2[*uPtr]++;
}
}
//统计面积个数
std::map<int, int> cAreaMap2;
for (const auto& v : vHist2)
{
std::map<int, int>::iterator it = cAreaMap2.find(v);
if (it != cAreaMap2.end())
{
it->second++;
continue;
}
else { cAreaMap2.insert(std::make_pair(v, 1)); };
}
//获得单个元器件面积(准确性待测试,假定不粘连占大多数!)
std::vector<tMap> tVector2;
std::map<int, int>::iterator it2;
for (it2 = cAreaMap2.begin(); it2 != cAreaMap2.end(); it2++)
{
tVector2.push_back(tMap(it2->first, it2->second));
}
std::sort(tVector2.begin(), tVector2.end(), std::greater<tMap>());
if (tVector2.size() < 2)
{
return FUNC_CANNOT_CALC;
}
//单个元件面积
sinPartSize = cvRound((tVector2[0].Key + tVector2[1].Key) / 2.);
//判断当数量过少时候当前方法判断的单个元件面积可能是错的
if (nccomps < 35)
{
//判断面积
sinPartSize = tVector2[tVector2.size() / 3].Key;
}
std::vector<int> trayCount(nccomps + 1, 0);
Palete pal;
unsigned int colorCount = 0;
......@@ -4248,10 +4308,10 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
for (int x = 0; x < X; x++) {
int label = ((int *)m1.data)[(x)+(y)*m1.cols];
CV_Assert(0 <= label && label <= nccomps);
if (binary.ptr<uint8_t>(y)[x]) {
if (binary4Count.ptr<uint8_t>(y)[x]) {
cc.ptr<cv::Vec4b>(y)[x] = cv::Vec4b((uchar)pal[label].val[0], (uchar)pal[label].val[1], (uchar)pal[label].val[2], 255);
}
binary.ptr<uint8_t>(y)[x] = colors[label];
binary4Count.ptr<uint8_t>(y)[x] = colors[label];
}
}
});
......@@ -4417,7 +4477,7 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
else {
//判断为散料
cv::threshold(srcPrev, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
cv::morphologyEx(binary, binary, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(75, 75)));
cv::morphologyEx(binary, binary, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(25, 25)));
//计算直方图
int hist[256];
for (int y = 0; y < 256; y++) hist[y] = 0;
......@@ -4432,17 +4492,14 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
}
cv::threshold(srcPrev, binary, Otsu(hist), 255, cv::THRESH_BINARY);
cv::threshold(srcPrev, binary, Otsu(hist) + 5, 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++)
{
......@@ -7024,18 +7081,6 @@ int eyemAchvMatchMat(EyemImage tpImage, EyemRect tpRoi, EyemImage *tpDstImg)
return FUNC_CANNOT_CALC;
}
cv::Mat srcPrev, srcPrevB;
cv::bitwise_not(trays[0].Tray, srcPrev);
//备份
srcPrevB = srcPrev.clone();
//二值化可以分别放在两个算法里
cv::Mat sinParts;
cv::threshold(srcPrev, sinParts, (255 - trays[0].dBackThresh), 255, cv::THRESH_BINARY);
//判断元件尺寸
int sinPartSize;
bool useTrackMethod = checkSize(srcPrev, sinParts, sinPartSize);
//连在一起
cv::morphologyEx(sinParts, sinParts, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(45, 45)));
//间隔采样,避免采样数量过大
cv::Point start = cv::Point((int)trays[0].Center.x, (int)trays[0].Center.y), end = cv::Point((int)trays[0].Center.x, 0);
//画中心
......@@ -7055,7 +7100,7 @@ int eyemAchvMatchMat(EyemImage tpImage, EyemRect tpRoi, EyemImage *tpDstImg)
cv::line(linesample, nstart, nend, cv::Scalar(255), 1);
cv::Mat sampleLine;
cv::bitwise_and(linesample, sinParts, sampleLine);
cv::bitwise_and(linesample, binary, sampleLine);
std::vector<cv::Point> idx;
cv::findNonZero(sampleLine, idx);
......@@ -8151,19 +8196,6 @@ int eyemTrainImageSampler(EyemImage tpImage, int iSize, const char *ccClassName,
return FUNC_CANNOT_CALC;
}
cv::Mat srcPrev, srcPrevB;
cv::bitwise_not(trays[0].Tray, srcPrev);
//备份
srcPrevB = srcPrev.clone();
//二值化可以分别放在两个算法里
cv::Mat sinParts;
cv::threshold(srcPrev, sinParts, (255 - trays[0].dBackThresh), 255, cv::THRESH_BINARY);
//判断元件尺寸
int sinPartSize;
bool useTrackMethod = checkSize(srcPrev, sinParts, sinPartSize);
//连在一起
cv::morphologyEx(sinParts, sinParts, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(45, 45)));
//间隔采样,避免采样数量过大
cv::Point start = cv::Point((int)trays[0].Center.x, (int)trays[0].Center.y), end = cv::Point((int)trays[0].Center.x, 0);
//画中心
......@@ -8183,7 +8215,7 @@ int eyemTrainImageSampler(EyemImage tpImage, int iSize, const char *ccClassName,
cv::line(linesample, nstart, nend, cv::Scalar(255), 1);
cv::Mat sampleLine;
cv::bitwise_and(linesample, sinParts, sampleLine);
cv::bitwise_and(linesample, binary, sampleLine);
std::vector<cv::Point> idx;
cv::findNonZero(sampleLine, idx);
......@@ -8278,10 +8310,34 @@ int eyemLibImpl(EyemImage tpImage, 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;
//图像尺寸
int X = image.cols, Y = image.rows;
//用于去除黑色坏点干扰
cv::Mat medBlur;
cv::medianBlur(image, medBlur, 3);
//去除局部量斑影响(默认亮斑尺寸不会大于15个像素)
cv::morphologyEx(medBlur, medBlur, cv::MORPH_ERODE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15)));
//图像增强
double min, max;
cv::minMaxLoc(medBlur, &min, &max, NULL);
image.convertTo(image, CV_64FC1);
image -= min;
image /= (max - min);
image *= 65535;
image.convertTo(image, CV_16UC1);
cv::Mat image8U;
image.convertTo(image8U, CV_8UC1, 1 / 255.);
cv::cvtColor(image8U, image8U, cv::COLOR_BGR2GRAY);
cv::Mat eqhist;
cv::equalizeHist(image8U, eqhist);
cv::imwrite("0.png",image8U);
return FUNC_OK;
#pragma region
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!