Commit 6e657cd2 张士柳

1 个父辈 50f8f9d5
......@@ -926,12 +926,12 @@ namespace eyemLib_Sharp
//eyemCountObjectE(image, fileName, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE(image, file.Replace(".png", ""), "D://批量测试图像模板文件//" + file.Replace(".png", "") + "_tpl.png", 0.75, ref pNumObj, out tpDstImg);
Bitmap bmp = eyemCvtToBitmap(tpDstImg);
//Bitmap bmp = eyemCvtToBitmap(tpDstImg);
if (bmp != null)
{
bmp.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
}
//if (bmp != null)
//{
// bmp.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
//}
////<解码测试
//int ipNum; EyemBarCode* tpResults;
......@@ -1070,7 +1070,6 @@ namespace eyemLib_Sharp
#region EyemImage转换成Bitmap
public static Bitmap eyemCvtToBitmap(EyemImage tpImage)
{
//统一将图像转换成8位显示
PixelFormat format;
switch (tpImage.iChannels)
......@@ -1087,17 +1086,9 @@ namespace eyemLib_Sharp
default:
return null;
}
//如果图不是8位的就转成8位显示
if (tpImage.iDepth != 0)
eyemCvtImageType(tpImage, "uint8_t", 1.0, 0.0, ref tpImage);
//所有算法输出结果图均为8位
Bitmap bitmap = new Bitmap(tpImage.iWidth, tpImage.iHeight, tpImage.iWidth * tpImage.iChannels, format, tpImage.vpImage);
BitmapData data = bitmap.LockBits(
new Rectangle(Point.Empty, new Size(tpImage.iWidth, tpImage.iHeight)),
ImageLockMode.WriteOnly,
format);
if (format == PixelFormat.Format8bppIndexed)
{
ColorPalette palette = bitmap.Palette;
......
此文件类型无法预览
......@@ -66,7 +66,7 @@ static void calcRotateRect(cv::Point2f pt, float t, float length, float width, c
pts[3].y = (float)(2 * pt.y - pts[1].y);
}
static cv::Mat getTplMat(cv::Mat &tplMat, double t)
static cv::Mat getTplMat(cv::Mat &tplMat, double t, int val)
{
const int tplH = tplMat.rows, tplW = tplMat.cols;
......@@ -83,12 +83,12 @@ static cv::Mat getTplMat(cv::Mat &tplMat, double t)
//旋转
cv::Mat tplMatD;
cv::warpAffine(tplMat, tplMatD, matx23f, cv::Size((int)width, (int)height), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0));
cv::warpAffine(tplMat, tplMatD, matx23f, cv::Size((int)width, (int)height), cv::INTER_LINEAR, cv::BORDER_CONSTANT, val);
return tplMatD;
}
static void findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double trackWidth, cv::Point2f *pts, double &maxVal, cv::Point2f &maxLoc)
static void findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double trackWidth, cv::Point2f *pts, int val, double &maxVal, cv::Point2f &maxLoc)
{
//图像尺寸
int X = image.cols, Y = image.rows;
......@@ -102,7 +102,7 @@ static void findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
cv::Point2i(cv::min(r.boundingRect().x + r.boundingRect().width + cvRound(trackWidth), X), \
cv::min(r.boundingRect().y + r.boundingRect().height + cvRound(trackWidth), Y)));
cv::Mat yyu = getTplMat(tplMat, t);
cv::Mat yyu = getTplMat(tplMat, t, val);
//判断待匹配图像是否小于模板图像
if (rr.width < yyu.cols || rr.height < yyu.rows)
......@@ -373,10 +373,10 @@ int eyemCountObject(EyemImage tpImage, const char *fileName, double dOffset, int
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
cv::Mat src8U;
//环鸿&佳世达
//环鸿
//src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//苏州公司
src = src(cv::Range(10, src.cols - 10), cv::Range(10, src.rows - 10)).clone();
//其他设备
src = src(cv::Range(20, src.cols - 20), cv::Range(20, src.rows - 20)).clone();
//image size
int X = src.cols, Y = src.rows;
......@@ -1342,10 +1342,10 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, const char *fileName, doubl
if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
//环鸿&佳世达图像裁剪
//环鸿
//src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//苏州公司&成都纬创
src = src(cv::Range(10, src.cols - 10), cv::Range(10, src.rows - 10)).clone();
//其他设备
src = src(cv::Range(20, src.cols - 20), cv::Range(20, src.rows - 20)).clone();
//图像尺寸
int X = src.cols, Y = src.rows;
......@@ -2880,9 +2880,9 @@ int eyemCountObjectE(EyemImage tpImage, const char *fileName, LPSTR *lpszNumObj,
cv::Mat src8U;
//环鸿&佳世达
//环鸿
//src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//苏州公司
//其他设备
src = src(cv::Range(10, src.cols - 10), cv::Range(10, src.rows - 10)).clone();
//image size
......@@ -3855,17 +3855,20 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
//图像裁剪
//环鸿&佳世达
//环鸿
src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//苏州公司&成都纬创
//其他设备
//src = src(cv::Range(10, src.cols - 10), cv::Range(10, src.rows - 10)).clone();
//图像尺寸
int X = src.cols, Y = src.rows;
//加载模板
cv::Mat tplMat = cv::imread(tplName, -1);
//图像尺寸
int X = src.cols, Y = src.rows;
//模板文件不存在
if (tplMat.empty())
return FUNC_CANNOT_CALC;
//模板尺寸
int tplWidth, tplHeight;
......@@ -3929,7 +3932,6 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//创建模板图像
//计数图像
cv::Mat lbMat(Y, X, CV_8UC1, cv::Scalar(0));
......@@ -4024,9 +4026,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配(仅处理料盘区域以提高速度)
cv::Mat tplResult0;
cv::matchTemplate(srcPrev(cv::Rect(tl, br)), getTplMat(tplMat, t), tplResult0, cv::TM_CCOEFF_NORMED);
cv::matchTemplate(srcPrev(cv::Rect(tl, br)), getTplMat(tplMat, t, (255 - backThresh)), tplResult0, cv::TM_CCOEFF_NORMED);
//分数大于0.7才当作元件处理
//分数大于一定分数才当作元件处理
tplResult0 = cv::Mat(tplResult0 > dMinScore);
cv::Point quard[4]{ cv::Point(tplResult0.cols,0),cv::Point(0,0),cv::Point(0,tplResult0.rows),cv::Point(tplResult0.cols,tplResult0.rows) };
......@@ -4127,7 +4129,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//计算极值
double maxyyu; cv::Point2f trackCentert;
findTrackModel(srcPrev, tplMat, 90 - (t + 180), trackWidth, pts, maxyyu, trackCentert);
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), maxyyu, trackCentert);
//匹配阈值
if (maxyyu > dMinScore)
......@@ -4151,7 +4153,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
dChordL = 2.0 * startRadius*sin(((2.0 * asin((cv::norm(startCenter - cv::Point2f((float)ecpectPos.x, \
(float)ecpectPos.y))) / (2.0 * startRadius))) * 180.0 / PI - dOffset)*PI / 180.0 / 2.0);
//cv::drawMarker(cc, cv::Point(ecpectPos.x, ecpectPos.y), cv::Scalar(0, 0, 255, 255), 0, 10);
cv::drawMarker(cc, cv::Point(ecpectPos.x, ecpectPos.y), cv::Scalar(0, 0, 255, 255), 0, 10);
}
else {
//用先前的方式重新计算间距,因为耗时操作不会在这里,加上可以减少耗时但可能不一定准
......@@ -4251,7 +4253,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配
double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90 - (t + 180), trackWidth, pts, maxyyu, maxyyuloc);
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), maxyyu, maxyyuloc);
//最小匹配结果
if (maxyyu > 0.15)
......@@ -4259,6 +4261,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//存放结果
vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
}
//测试标记
cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
}
//如果为0大概率是背景
......@@ -4268,6 +4273,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
//判断是否超出图像范围
if (trackCenter.x < 0 || trackCenter.y < 0)
break;
//理论元件位置
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
......@@ -4280,15 +4289,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配/更新元件精确位置
double maxyyu;
findTrackModel(srcPrev, tplMat, 90 - (trackAngle + 180), trackWidth, pts, maxyyu, trackCenter);
findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), maxyyu, trackCenter);
//如果匹配得到的分数过低
if (maxyyu < 0.45) {
vParts.clear();
//旋转模板角度[-2,2]范围内寻找最佳
//旋转模板角度[-3,3]范围内寻找最佳
for (double t = -3.0; t < 3.0; t += dMinorStep*5.)
{
findTrackModel(srcPrev, tplMat, 90 - (trackAngle + 180) + t, trackWidth, pts, maxyyu, trackCenter);
findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0) + t, trackWidth, pts, (255 - backThresh), maxyyu, trackCenter);
//存放结果
vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
}
......@@ -4310,11 +4319,16 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//计算理论元件区域
calcRotateRect(trackCenterT, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
#ifdef _DEBUG
cv::Point2f ptsT[4];
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT);
//画出元件区域
//for (int j = 0; j < 4; j++)
//{
// cv::line(cc, pts[j], pts[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
//}
for (int j = 0; j < 4; j++)
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
#endif
//判断是否追踪终止
cv::RotatedRect rtt(pts[0], pts[1], pts[2]);
......@@ -4328,7 +4342,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断并未终止,重新确定精确元件位置
//判断可能并未终止,采用理论位置作为下一个元件位置
trackCenter = trackCenterT;
//标记为已追踪过
......@@ -4391,7 +4405,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配
double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90 - (t + 180), trackWidth, pts, maxyyu, maxyyuloc);
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), maxyyu, maxyyuloc);
//最小匹配结果
if (maxyyu > 0.15) {
......@@ -4400,7 +4414,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
}
//测试标记
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
}
if (vParts.size() == 0)
break;
......@@ -4408,6 +4422,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
//判断是否超出图像范围
if (trackCenter.x < 0 || trackCenter.y < 0)
break;
//理论元件区域
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
......@@ -4420,16 +4438,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配/更新元件精确位置
double maxyyu;
findTrackModel(srcPrev, tplMat, 90 - (trackAngle + 180), trackWidth, pts, maxyyu, trackCenter);
findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), maxyyu, trackCenter);
//如果匹配得到的分数过低
if (maxyyu < 0.45) {
vParts.clear();
//旋转模板角度[-2,2]范围内寻找最佳
//旋转模板角度[-3,3]范围内寻找最佳
for (double t = -3.0; t < 3.0; t += dMinorStep*5.)
{
findTrackModel(srcPrev, tplMat, 90 - (trackAngle + 180) + t, trackWidth, pts, maxyyu, trackCenter);
findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0) + t, trackWidth, pts, (255 - backThresh), maxyyu, trackCenter);
//存放结果
vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
}
......@@ -4438,6 +4455,8 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//更新最接近的
trackCenter = cv::Point2f(vParts[0].Pos.x, vParts[0].Pos.y);
}
if (trackCenter.x == 1358 && trackCenter.y == 1568)
std::cout << "" << std::endl;
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
......@@ -4451,11 +4470,16 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//计算理论元件位置
calcRotateRect(trackCenterT, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
#ifdef _DEBUG
cv::Point2f ptsT[4];
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT);
//画出元件区域
//for (int j = 0; j < 4; j++)
//{
// cv::line(cc, pts[j], pts[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
//}
for (int j = 0; j < 4; j++)
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
#endif
//判断是否追踪终止
cv::RotatedRect rtt(pts[0], pts[1], pts[2]);
......@@ -4470,7 +4494,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断并未终止,重新确定精确元件位置
//判断可能并未终止,采用理论位置作为下一个元件位置
trackCenter = trackCenterT;
//标记为已追踪过
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!