Commit 9e0af8f7 张士柳

1 个父辈 168a9ae6
...@@ -836,7 +836,9 @@ extern "C" { ...@@ -836,7 +836,9 @@ extern "C" {
EXPORTS int eyemCountObjectE(EyemImage tpImage, const char *fileName, LPSTR *lpszNumObj, EyemImage *tpDstImg); EXPORTS int eyemCountObjectE(EyemImage tpImage, const char *fileName, LPSTR *lpszNumObj, EyemImage *tpDstImg);
EXPORTS int eyemCountObjectIrregularParts(EyemImage tpImage, const char *fileName, double dOffset, const char * ccSubType, int iMaxArea, int iWinSize, LPSTR *lpszNumObj, EyemImage *tpDstImg); EXPORTS int eyemCountObjectIrregularParts(EyemImage tpImage, const char *fileName, double dOffset, const char * ccSubType, int iMaxArea, int iWinSize, LPSTR *lpszNumObj, EyemImage *tpDstImg);
EXPORTS int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, const char *ccTplName, double dMinScore, LPSTR *lpszNumObj, EyemImage *tpDstImg); EXPORTS int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, const char *ccTplName, double dMinScore, LPSTR *lpszNumObj, EyemImage *tpDstImg);
EXPORTS int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, const char *ccTplName); EXPORTS int eyemCalcTemplateImage(EyemImage tpImage, EyemImage *tpDstImg);
EXPORTS int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, double dMinScore, const char *ccTplName);
EXPORTS int eyemMatchTemplateModel(EyemImage tpImage, const char *ccTplNames, LPSTR *lpszTplName);
EXPORTS int eyemTrackFeature(EyemImage tpPrevImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum, int *ipResults); EXPORTS int eyemTrackFeature(EyemImage tpPrevImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum, int *ipResults);
EXPORTS int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum); EXPORTS int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum);
......
...@@ -129,14 +129,27 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra ...@@ -129,14 +129,27 @@ static bool 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 yuuc = image(rr&cv::Rect(0, 0, X, Y));
float matx[6]; float matx[6];
cv::Mat tty = getTrackMat(yuuc, -t, val, matx); cv::Mat trackMat = getTrackMat(image(rr&cv::Rect(0, 0, X, Y)).clone(), -t, val, matx);
if (trackMat.cols <= (tplMat.cols - 1) || trackMat.rows <= (tplMat.rows - 1))
return true;
const int icvTemplateMatchModes[2] = { cv::TM_SQDIFF_NORMED,cv::TM_CCOEFF_NORMED };
//计算匹配位置 //计算匹配位置
cv::Mat tplResult0; std::vector<cv::Mat> tplResults(6);
cv::matchTemplate(tty, tplMat, tplResult0, cv::TM_CCOEFF_NORMED); cv::parallel_for_(cv::Range(0, 2), [&](const cv::Range& range)->void {
for (int m = range.start; m < range.end; m++)
{
cv::Mat tplResult;
cv::matchTemplate(trackMat, tplMat, tplResult, icvTemplateMatchModes[m]);
tplResults[icvTemplateMatchModes[m]] = tplResult;
}
});
cv::Mat tplResult0 = tplResults[5] - tplResults[1];
//计算极值坐标 //计算极值坐标
cv::Point maxyyuloc; cv::Point maxyyuloc;
...@@ -145,22 +158,14 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra ...@@ -145,22 +158,14 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
//偏移到中心 //偏移到中心
maxyyuloc += cv::Point(tplMat.cols / 2, tplMat.rows / 2); maxyyuloc += cv::Point(tplMat.cols / 2, tplMat.rows / 2);
//测试用,限制在理论范围内 //结果坐标限制在理论范围内
if (bFinal) if (bFinal)
{ {
//重新确定位置 //重新确定位置
cv::Rect rLimit(cv::Point((tty.cols - tplMat.cols) / 2, (tty.rows - tplMat.rows) / 2), tplMat.size()); cv::Rect rLimit(cv::Point((trackMat.cols - tplMat.cols) / 2, (trackMat.rows - tplMat.rows) / 2), tplMat.size());
cv::Mat showMat;
cv::cvtColor(tty, showMat, cv::COLOR_GRAY2BGR);
cv::rectangle(showMat, rLimit, cv::Scalar(0, 255, 0, 255));
cv::Mat test = getTplMat(mask.getMat()(rr&cv::Rect(0, 0, X, Y)), -t, 0);
//判断区域内有效面积所占比例 //判断区域内有效面积所占比例
if ((float)cv::countNonZero(test(rLimit)) / (float)rLimit.area() < 0.15) { if ((float)cv::countNonZero(getTplMat(mask.getMat()(rr&cv::Rect(0, 0, X, Y)), -t, 0)(rLimit)) / (float)rLimit.area() < 0.18) {
//料盘结束 //料盘结束
return true; return true;
} }
...@@ -426,6 +431,14 @@ static bool checkSize(cv::Mat &srcPrev, cv::Mat &mask, int &partSize) ...@@ -426,6 +431,14 @@ static bool checkSize(cv::Mat &srcPrev, cv::Mat &mask, int &partSize)
return partSize >= 20; return partSize >= 20;
} }
void sumTest()
{
int a = 0;
for (int i = 0; i < 100000000; i++)
a++;
}
#pragma endregion #pragma endregion
int eyemCountObject(EyemImage tpImage, const char *fileName, double dOffset, int iMinArea, int iMaxArea, int iWinSize, LPSTR *lpszNumObj, EyemImage *tpDstImg) int eyemCountObject(EyemImage tpImage, const char *fileName, double dOffset, int iMinArea, int iMaxArea, int iWinSize, LPSTR *lpszNumObj, EyemImage *tpDstImg)
...@@ -3940,6 +3953,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -3940,6 +3953,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
int tplWidth, tplHeight; int tplWidth, tplHeight;
tplWidth = tplMat.cols, tplHeight = tplMat.rows; tplWidth = tplMat.cols, tplHeight = tplMat.rows;
// double begin0 = (double)cv::getTickCount();
// //并行计算测试用
////#pragma omp parallel for
// for (int i = 0; i < 100; i++)
// {
// sumTest();
// }
// std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
//去除局部量斑影响(默认亮斑尺寸不会大于15个像素) //去除局部量斑影响(默认亮斑尺寸不会大于15个像素)
cv::Mat srcTmp; cv::Mat srcTmp;
cv::morphologyEx(src, srcTmp, cv::MORPH_ERODE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15))); cv::morphologyEx(src, srcTmp, cv::MORPH_ERODE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15)));
...@@ -4075,7 +4097,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4075,7 +4097,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
tl = cv::Point(cv::max(rec.tl().x - 35, 0), cv::max(rec.tl().y - 35, 0)); br = cv::Point(cv::min(rec.br().x + 35, Y), cv::min(rec.br().y + 35, Y)); tl = cv::Point(cv::max(rec.tl().x - 35, 0), cv::max(rec.tl().y - 35, 0)); br = cv::Point(cv::min(rec.br().x + 35, Y), cv::min(rec.br().y + 35, Y));
tr = cv::Point(br.x, tl.y); bl = cv::Point(tl.x, br.y); tr = cv::Point(br.x, tl.y); bl = cv::Point(tl.x, br.y);
//用八个方向的模板进行模板匹配(模板匹配的方式对于发生形变的器件效果不好) //用八个方向的模板进行模板匹配(模板匹配的方式对于发生形变的器件效果不好,实在不行就用八个方向,增加起点数量来弥补追踪终止导致的偏差)
const float icvDirections[4] = { 0 , 90 , 180 , -90 }; const float icvDirections[4] = { 0 , 90 , 180 , -90 };
//用以计算元件中心 //用以计算元件中心
...@@ -4137,7 +4159,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4137,7 +4159,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
*/ */
for (std::vector<cv::Point>::iterator itv = matchPts.begin(); itv != matchPts.end(); ++itv) for (std::vector<cv::Point>::iterator itv = matchPts.begin(); itv != matchPts.end(); ++itv)
{ {
//cv::drawMarker(cc, cv::Point((*itv).x, (*itv).y), cv::Scalar(0, 255, 0, 255)); cv::drawMarker(cc, cv::Point((*itv).x, (*itv).y), cv::Scalar(0, 255, 0, 255));
} }
#endif #endif
...@@ -4214,12 +4236,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4214,12 +4236,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
std::sort(track4ChordL.begin(), track4ChordL.end(), std::greater<Track>()); std::sort(track4ChordL.begin(), track4ChordL.end(), std::greater<Track>());
cv::Point ecpectPos = track4ChordL[0].Pos; cv::Point expectPos = track4ChordL[0].Pos;
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)expectPos.x, \
(float)ecpectPos.y))) / (2.0 * startRadius))) * 180.0 / PI - dOffset)*PI / 180.0 / 2.0); (float)expectPos.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(expectPos.x, expectPos.y), cv::Scalar(0, 0, 255, 255), 0, 10);
} }
else { else {
//用先前的方式重新计算间距,因为耗时操作不会在这里,加上可以减少耗时但可能不一定准 //用先前的方式重新计算间距,因为耗时操作不会在这里,加上可以减少耗时但可能不一定准
...@@ -4241,6 +4264,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4241,6 +4264,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
if (trackMat.ptr<uint8_t>((int)startCenter.y)[(int)startCenter.x] == 255) if (trackMat.ptr<uint8_t>((int)startCenter.y)[(int)startCenter.x] == 255)
continue; continue;
//除去内圈干扰
if (cv::norm(startCenter - reelCenter) < 150)
continue;
//计算元件区域 //计算元件区域
cv::Point2f points[4]; cv::Point2f points[4];
{ {
...@@ -4286,8 +4313,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4286,8 +4313,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//并行处理 //并行处理
//#pragma omp parallel sections //#pragma omp parallel sections
{ {
//(顺时针) //#pragma omp section //(顺时针)
//#pragma omp section
{ {
//追踪中心 //追踪中心
cv::Point2f trackCenter = cv::Point2f(startCenter.x, startCenter.y); cv::Point2f trackCenter = cv::Point2f(startCenter.x, startCenter.y);
...@@ -4339,10 +4365,6 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4339,10 +4365,6 @@ 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);
...@@ -4360,12 +4382,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4360,12 +4382,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//进一步确认元件位置 //进一步确认元件位置
bool trayEnd = false; bool trayEnd = false;
if (true) { if (true) {
//考虑增加[-2,2]角度范围以应对料盘变形
//再确认一下
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary); trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary);
} }
//if (cvRound(trackCenter.x) == 597 && cvRound(trackCenter.y) == 1504) //if (cvRound(trackCenter.x) == 336 && cvRound(trackCenter.y) == 536)
// std::cout << "" << std::endl; // std::cout << "" << std::endl;
//更新扫描半径 //更新扫描半径
...@@ -4431,6 +4452,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4431,6 +4452,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置 //标记当前位置
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);
} }
else else
{ {
...@@ -4443,6 +4465,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4443,6 +4465,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置 //标记当前位置
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);
} }
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl; //std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
...@@ -4451,8 +4474,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4451,8 +4474,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
} while (!trackEnd); } while (!trackEnd);
} }
//#pragma omp section //#pragma omp section //(逆时针)
//逆时针追踪
{ {
//追踪起点 //追踪起点
cv::Point2f trackCenter(startCenter.x, startCenter.y); cv::Point2f trackCenter(startCenter.x, startCenter.y);
...@@ -4499,10 +4521,6 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4499,10 +4521,6 @@ 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);
...@@ -4520,12 +4538,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4520,12 +4538,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
// //
bool trayEnd = false; bool trayEnd = false;
if (true) { if (true) {
//再确认一下 //考虑增加[-2,2]角度范围以应对料盘变形
trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary); trayEnd = findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), true, maxyyu, trackCenter, binary);
} }
//if (cvRound(trackCenter.x) == 1230 && cvRound(trackCenter.y) == 497) //if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
// std::cout << "" << std::endl; // std::cout << "xx" << std::endl;
//}
//更新扫描半径 //更新扫描半径
trackRadius = cv::norm(trackCenter - reelCenter); trackRadius = cv::norm(trackCenter - reelCenter);
...@@ -4591,6 +4610,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4591,6 +4610,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置 //标记当前位置
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);
} }
else else
{ {
...@@ -4603,6 +4623,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4603,6 +4623,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置 //标记当前位置
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);
} }
trackEnd = (!found); trackEnd = (!found);
...@@ -4633,7 +4654,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4633,7 +4654,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//内存尺寸 //内存尺寸
int _Size = tpDstImg->iWidth*tpDstImg->iHeight*tpDstImg->iChannels * sizeof(uint8_t); int _Size = tpDstImg->iWidth*tpDstImg->iHeight*tpDstImg->iChannels * sizeof(uint8_t);
//分配内存 //分配初始化内存
tpDstImg->vpImage = (uint8_t *)malloc(_Size); tpDstImg->vpImage = (uint8_t *)malloc(_Size);
if (NULL == tpDstImg->vpImage) if (NULL == tpDstImg->vpImage)
return FUNC_NOT_ENOUGH_MEM; return FUNC_NOT_ENOUGH_MEM;
...@@ -4646,14 +4667,46 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons ...@@ -4646,14 +4667,46 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
return FUNC_OK; return FUNC_OK;
} }
int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, const char *ccTplName) int eyemCalcTemplateImage(EyemImage tpImage, EyemImage *tpDstImg)
{
cv::Mat image = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage);
//检查文件是否存在
if (image.empty())
return FUNC_IMAGE_NOT_EXIST;
cv::Mat srcPrev;
//预处理
///<输出计数结果标记图像
{
tpDstImg->iWidth = srcPrev.cols; tpDstImg->iHeight = srcPrev.rows; tpDstImg->iDepth = srcPrev.depth(); tpDstImg->iChannels = srcPrev.channels();
//内存尺寸
int _Size = tpDstImg->iWidth*tpDstImg->iHeight*tpDstImg->iChannels * sizeof(uint8_t);
//分配初始化内存
tpDstImg->vpImage = (uint8_t *)malloc(_Size);
if (NULL == tpDstImg->vpImage)
return FUNC_NOT_ENOUGH_MEM;
memset(tpDstImg->vpImage, 0, _Size);
//拷贝数据
memcpy(tpDstImg->vpImage, srcPrev.data, _Size);
}
return FUNC_OK;
}
int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, double dMinScore, const char *ccTplName)
{ {
cv::Mat tplMat = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage)\ cv::Mat tplMat = cv::Mat(tpImage.iHeight, tpImage.iWidth, MAKETYPE(tpImage.iDepth, tpImage.iChannels), tpImage.vpImage)\
(cv::Rect(tpRoi.iXs, tpRoi.iYs, tpRoi.iWidth, tpRoi.iHeight)).clone(); (cv::Rect(tpRoi.iXs, tpRoi.iYs, tpRoi.iWidth, tpRoi.iHeight)).clone();
//模板信息 //模板信息
std::string hint = " " + std::to_string(tpRoi.iXs) + "," + std::to_string(tpRoi.iYs) + "," \ std::string hint = " " + std::to_string(tpRoi.iXs) + "," + std::to_string(tpRoi.iYs) + "," \
+ std::to_string(tpRoi.iWidth) + "," + std::to_string(tpRoi.iHeight); + std::to_string(tpRoi.iWidth) + "," + std::to_string(tpRoi.iHeight) + "," + std::to_string(dMinScore);
//内存尺寸(将信息添加到图像后面) //内存尺寸(将信息添加到图像后面)
int _Size = tplMat.cols*tplMat.rows*tplMat.channels() * sizeof(uint8_t); int _Size = tplMat.cols*tplMat.rows*tplMat.channels() * sizeof(uint8_t);
...@@ -4683,6 +4736,76 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, const char *ccTpl ...@@ -4683,6 +4736,76 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, const char *ccTpl
return FUNC_OK; return FUNC_OK;
} }
static void getFiles(std::string filePath, std::vector<std::string>& fileNames)
{
//文件句柄
intptr_t hFile = 0;
//文件信息
struct _finddata_t fileinfo;
std::string p;
if ((hFile = _findfirst(p.assign(filePath).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,迭代之,如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR)) {
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(filePath).append("\\").append(fileinfo.name), fileNames);
}
else {
fileNames.push_back(p.assign(filePath).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int eyemMatchTemplateModel(EyemImage tpImage, const char *ccTplNames, LPSTR *lpszTplName)
{
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;
const float icvDirections[4] = { 0 , 90 , 180 , -90 };
//获取文件路径
std::vector<std::string> fileNames;
getFiles(std::string(ccTplNames), fileNames);
//载入所有模板
std::vector<cv::Mat> tplMats;
for (int i = 0; i < (int)fileNames.size(); i++)
{
cv::Mat tplMat;
//
//
//
tplMats.push_back(tplMat);
}
//遍历所有模板
cv::parallel_for_(cv::Range(0, tplMats.size()), [&](const cv::Range& range)->void {
for (int tpl = range.start; tpl < range.end; tpl++)
{
cv::Mat tplMat = tplMats[tpl];
for (int d = 0; d < 4; d++)
{
//模板匹配
cv::matchTemplate(image, tplMat, cv::noArray(), cv::TM_CCOEFF_NORMED);
}
}
});
//计算最佳匹配模板
return FUNC_OK;
}
int eyemTrackFeature(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum, int *ipResults) int eyemTrackFeature(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum, int *ipResults)
{ {
cv::Mat refImg(tpRefImg.iHeight, tpRefImg.iWidth, cv::Mat refImg(tpRefImg.iHeight, tpRefImg.iWidth,
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!