Commit 6e657cd2 张士柳

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