Commit 6b03fe92 张士柳

1 个父辈 84029fbf
...@@ -912,9 +912,9 @@ namespace eyemLib_Sharp ...@@ -912,9 +912,9 @@ namespace eyemLib_Sharp
EyemRect tpRoi = new EyemRect(); EyemRect tpRoi = new EyemRect();
tpRoi.iXs = 200; tpRoi.iYs = 200; tpRoi.iXs = 20; tpRoi.iYs = 20;
tpRoi.iWidth = image.iWidth - 400; tpRoi.iWidth = image.iWidth - 40;
tpRoi.iHeight = image.iHeight - 400; tpRoi.iHeight = image.iHeight - 40;
// //
string pNumObj = ""; string pNumObj = "";
...@@ -932,12 +932,12 @@ namespace eyemLib_Sharp ...@@ -932,12 +932,12 @@ namespace eyemLib_Sharp
//创建模板匹配模型 //创建模板匹配模型
EyemRect tpRoi2 = new EyemRect(); EyemRect tpRoi2 = new EyemRect();
tpRoi2.iXs = 1026; tpRoi2.iYs = 513; tpRoi2.iXs = 0; tpRoi2.iYs = 0;
tpRoi2.iWidth = 41; tpRoi2.iWidth = image.iWidth;
tpRoi2.iHeight = 14; tpRoi2.iHeight = image.iHeight;
double matchDeg = 0.75; double matchDeg = 0.75;
//flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl")); //flag = eyemCreateTemplateModel(image, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//string selectModel = ""; //string selectModel = "";
//flag = eyemMatchTemplateModel(tpDstImg, "D:\\模板文件", ref selectModel); //flag = eyemMatchTemplateModel(tpDstImg, "D:\\模板文件", ref selectModel);
...@@ -952,7 +952,7 @@ namespace eyemLib_Sharp ...@@ -952,7 +952,7 @@ namespace eyemLib_Sharp
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), selectModel, ref pNumObj, out tpDstImg); //eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), selectModel, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + file.Replace(".png", ".tpl"), ref pNumObj, out tpDstImg); eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + file.Replace(".png", ".tpl"), ref pNumObj, out tpDstImg);
Bitmap bitmap = eyemCvtToBitmap(tpDstImg); //Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//if (bitmap != null) //if (bitmap != null)
//{ //{
......
此文件类型无法预览
...@@ -4470,89 +4470,133 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4470,89 +4470,133 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//偏移角度(元件尺寸) //偏移角度(元件尺寸)
const double dOffset = (2 * asin(2 * trackLength / (2 * startRadius))) * 180. / PI; const double dOffset = (2 * asin(2 * trackLength / (2 * startRadius))) * 180. / PI;
//优化开关
#define OPTIMAL_ON true
#if OPTIMAL_ON
//考虑作并行处理 //考虑作并行处理
tbb::parallel_invoke( tbb::parallel_invoke(
[&] [&]
#endif
{ {
std::cout << tbb::this_tbb_thread::get_id() << std::endl; ///< 顺时针追踪
//追踪中心
cv::Point2f trackCenter = cv::Point2f(startCenter.x, startCenter.y);
//追踪角度、半径
double trackAngle = startAngle, trackRadius = startRadius;
//元件本身角度
double trackOffset = dOffset;
//元件间间距
double partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//外接矩形顶点
cv::Point2f pts[4];
//开始追踪
bool trackEnd = true;
do
{
double begin0 = (double)cv::getTickCount();
#pragma region //(顺时针) bool found = true;
std::vector<Track> vParts;
{ for (double t = trackAngle + (trackOffset / 2.0 + partDist + trackOffset / 3.0); t < trackAngle + \
//追踪中心 (trackOffset / 2.0 + partDist + trackOffset / 3.0) + trackOffset / 3.0; t += dMinorStep)
cv::Point2f trackCenter = cv::Point2f(startCenter.x, startCenter.y);
//追踪角度、半径
double trackAngle = startAngle, trackRadius = startRadius;
//元件本身角度
double trackOffset = dOffset;
//元件间间距
double partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//外接矩形顶点
cv::Point2f pts[4];
//开始追踪
bool trackEnd = true;
do
{ {
double begin0 = (double)cv::getTickCount(); trackCenter.x = reelCenter.x + (float)trackRadius*(float)cos(t*c);
trackCenter.y = reelCenter.y + (float)trackRadius*(float)sin(t*c);
bool found = true; //计算旋转矩形
std::vector<Track> vParts; calcRotateRect(trackCenter, (float)t, (float)trackLength, (float)trackWidth, pts);
for (double t = trackAngle + (trackOffset / 2.0 + partDist + trackOffset / 3.0); t < trackAngle + \ //模板匹配
(trackOffset / 2.0 + partDist + trackOffset / 3.0) + trackOffset / 3.0; t += dMinorStep) double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, maxyyuloc, cv::noArray());
//最小匹配结果
if (maxyyu > 0.15)
{ {
trackCenter.x = reelCenter.x + (float)trackRadius*(float)cos(t*c); //存放结果
trackCenter.y = reelCenter.y + (float)trackRadius*(float)sin(t*c); vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
}
//计算旋转矩形 //测试标记
calcRotateRect(trackCenter, (float)t, (float)trackLength, (float)trackWidth, pts); //cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
}
//模板匹配 //如果为0大概率是背景
double maxyyu; cv::Point2f maxyyuloc; if (vParts.size() <= 0)
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, maxyyuloc, cv::noArray()); break;
//最小匹配结果 //更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
if (maxyyu > 0.15) trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
{
//存放结果
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); cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
}
//如果为0大概率是背景 //更新扫描角度
if (vParts.size() <= 0) trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
break;
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差 ///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
//理论元件位置 calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
//更新扫描角度 //模板匹配/更新元件精确位置
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI; double maxyyu;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray());
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题) //进一步确认元件位置
bool trayEnd = false;
if (true) {
//考虑增加[-2,2]角度范围以应对料盘变形
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary);
}
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts); //if (cvRound(trackCenter.x) == 336 && cvRound(trackCenter.y) == 536)
// std::cout << "" << std::endl;
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量(元件大小)
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算实际元件区域
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//模板匹配/更新元件精确位置 #ifdef _DEBUG
double maxyyu; cv::Point2f ptsT[4];
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray()); calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT);
//进一步确认元件位置 if (!trayEnd)
bool trayEnd = false; {
if (true) { //画出元件区域
//考虑增加[-2,2]角度范围以应对料盘变形 for (int j = 0; j < 4; j++)
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary); {
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
} }
}
//if (cvRound(trackCenter.x) == 336 && cvRound(trackCenter.y) == 536) #endif
// std::cout << "" << std::endl;
//判断是否追踪终止
if (trayEnd) {
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenterT.y))[cvRound(trackCenterT.x)] == 255) {
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter = trackCenterT;
///<更新追踪信息
//更新扫描半径 //更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter); trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度 //更新扫描角度
...@@ -4562,161 +4606,159 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4562,161 +4606,159 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//更新元件间角度 //更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI; partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算实际元件区域 //计算理论元件区域
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts); calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
#ifdef _DEBUG //标记为已追踪过
cv::Point2f ptsT[4]; std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT); cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
if (!trayEnd) //标记计数
{ lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//画出元件区域
for (int j = 0; j < 4; j++)
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
}
#endif
//判断是否追踪终止 //标记当前位置
if (trayEnd) { cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
//不再判断,大概率已经终止 //cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
found = false; }
} else
else if (trackMat.ptr<uint8_t>(cvRound(trackCenterT.y))[cvRound(trackCenterT.x)] == 255) { {
//不再判断,大概率已经终止 //标记为已追踪过
found = false; std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
} cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断可能并未终止,遂采用理论位置作为下一个元件位置 //标记计数
trackCenter = trackCenterT; lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
///<更新追踪信息 //标记当前位置
//更新扫描半径 cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
trackRadius = cv::norm(trackCenter - reelCenter); //cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
//更新扫描角度 }
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量(元件大小)
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算理论元件区域 //std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//标记为已追踪过 trackEnd = (!found);
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) }; } while (!trackEnd);
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记计数 }
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255; #if OPTIMAL_ON
,
[&]
#endif
{
///< 逆时针追踪
//追踪起点
cv::Point2f trackCenter(startCenter.x, startCenter.y);
//起始扫描角度、半径
double trackAngle = startAngle, trackRadius = startRadius;
//元件本身角度
double trackOffset = dOffset;
//元件间间距
double partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//外接矩形
cv::Point2f pts[4];
//开始追踪
bool trackEnd = true;
//
do
{
bool found = true;
std::vector<Track> vParts;
for (double t = trackAngle - (trackOffset / 3.0 + partDist + trackOffset / 2.0); t > trackAngle - \
(trackOffset / 3.0 + partDist + trackOffset / 2.0) - trackOffset / 3.0; t -= dMinorStep)
{
trackCenter.x = float(reelCenter.x + trackRadius*cos(t*c));
trackCenter.y = float(reelCenter.y + trackRadius*sin(t*c));
//标记当前位置 //计算旋转矩形
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5); calcRotateRect(trackCenter, (float)t, (float)trackLength, (float)trackWidth, pts);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
else
{
//标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记计数 //模板匹配
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255; double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, maxyyuloc, cv::noArray());
//标记当前位置 //最小匹配结果
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5); if (maxyyu > 0.15) {
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5); //存放结果
vParts.push_back(Track(0, 0, maxyyu, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), std::vector<cv::Point2f>()));
} }
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl; //测试标记
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
trackEnd = (!found); }
} while (!trackEnd); if (vParts.size() == 0)
} break;
#pragma endregion
}, //更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
[&] trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y);
{
std::cout << tbb::this_tbb_thread::get_id() << std::endl;
#pragma region //(逆时针) //理论元件区域
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y);
{ //更新扫描角度
//追踪起点 trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
cv::Point2f trackCenter(startCenter.x, startCenter.y);
//起始扫描角度、半径
double trackAngle = startAngle, trackRadius = startRadius;
//元件本身角度
double trackOffset = dOffset;
//元件间间距
double partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//外接矩形
cv::Point2f pts[4];
//开始追踪
bool trackEnd = true;
//
do
{
bool found = true;
std::vector<Track> vParts;
for (double t = trackAngle - (trackOffset / 3.0 + partDist + trackOffset / 2.0); t > trackAngle - \
(trackOffset / 3.0 + partDist + trackOffset / 2.0) - trackOffset / 3.0; t -= dMinorStep)
{
trackCenter.x = float(reelCenter.x + trackRadius*cos(t*c));
trackCenter.y = float(reelCenter.y + trackRadius*sin(t*c));
//计算旋转矩形 ///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
calcRotateRect(trackCenter, (float)t, (float)trackLength, (float)trackWidth, pts);
//模板匹配 calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
double maxyyu; cv::Point2f maxyyuloc;
findTrackModel(srcPrev, tplMat, 90.0 - (t + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, maxyyuloc, cv::noArray());
//最小匹配结果 //模板匹配/更新元件精确位置+判断
if (maxyyu > 0.15) { double maxyyu;
//存放结果 //findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray());
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); bool trayEnd = false;
} if (true) {
if (vParts.size() == 0) //考虑增加[-2,2]角度范围以应对料盘变形
break; trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary);
}
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差 //if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
trackCenter = cv::Point2f((float)vParts[vParts.size() / 2].Pos.x, (float)vParts[vParts.size() / 2].Pos.y); // std::cout << "xx" << std::endl;
//}
//理论元件区域 //更新扫描半径
cv::Point2f trackCenterT(trackCenter.x, trackCenter.y); trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//更新扫描角度 //计算实际元件位置
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI; calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题) #ifdef _DEBUG
cv::Point2f ptsT[4];
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT);
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts); if (!trayEnd)
{
//画出元件区域
for (int j = 0; j < 4; j++)
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
}
//模板匹配/更新元件精确位置+判断 #endif
double maxyyu;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray());
// //判断是否追踪终止
bool trayEnd = false; if (trayEnd)
if (true) { {
//考虑增加[-2,2]角度范围以应对料盘变形 //不再判断,大概率已经终止
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary); found = false;
} }
else if (trackMat.ptr<uint8_t>(cvRound(trackCenterT.y))[cvRound(trackCenterT.x)] == 255) {
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){ //判断可能并未终止,遂采用理论位置作为下一个元件位置
// std::cout << "xx" << std::endl; trackCenter = trackCenterT;
//}
///<更新追踪信息
//更新扫描半径 //更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter); trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度 //更新扫描角度
...@@ -4726,83 +4768,40 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4726,83 +4768,40 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//更新元件间角度 //更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI; partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算实际元件位置 //计算理论元件位置
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts); calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
#ifdef _DEBUG //标记为已追踪过
cv::Point2f ptsT[4]; std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, ptsT); cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
if (!trayEnd) //标记计数
{ lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//画出元件区域
for (int j = 0; j < 4; j++)
{
cv::line(cc, ptsT[j], ptsT[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
}
}
#endif
//判断是否追踪终止
if (trayEnd)
{
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenterT.y))[cvRound(trackCenterT.x)] == 255) {
//不再判断,大概率已经终止
found = false;
}
else if (trackMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] == 255) {
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter = trackCenterT;
///<更新追踪信息
//更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter);
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
//更新偏移量
trackOffset = (2 * asin(2 * trackLength / (2 * trackRadius))) * 180 / PI;
//更新元件间角度
partDist = (2 * asin(dChordL / (2 * trackRadius))) * 180 / PI;
//计算理论元件位置
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
//标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记计数
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//标记当前位置 //标记当前位置
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5); cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5); //cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
} }
else else
{ {
//标记为已追踪过 //标记为已追踪过
std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) }; std::vector<cv::Point> ptPoly = { cv::Point(pts[0]),cv::Point(pts[1]) ,cv::Point(pts[2]) ,cv::Point(pts[3]) };
cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255)); cv::fillConvexPoly(trackMat, ptPoly, cv::Scalar(255));
//标记计数
lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//标记当前位置 //标记计数
cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5); lbMat.ptr<uint8_t>(cvRound(trackCenter.y))[cvRound(trackCenter.x)] = 255;
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
trackEnd = (!found); //标记当前位置
} while (!trackEnd); cv::drawMarker(cc, trackCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 5);
} //cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
#pragma endregion }
}); trackEnd = (!found);
} while (!trackEnd);
}
#if OPTIMAL_ON
);
#endif
} }
//计数 //计数
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!