Commit 01b04fdd 张士柳

1 个父辈 5d801ec0
...@@ -999,9 +999,9 @@ namespace eyemLib_Sharp ...@@ -999,9 +999,9 @@ namespace eyemLib_Sharp
EyemRect tpRoi = new EyemRect(); EyemRect tpRoi = new EyemRect();
tpRoi.iXs = 50; tpRoi.iYs = 50; tpRoi.iXs = 200; tpRoi.iYs = 200;
tpRoi.iWidth = image.iWidth - 100; tpRoi.iWidth = image.iWidth - 400;
tpRoi.iHeight = image.iHeight - 100; tpRoi.iHeight = image.iHeight - 400;
// //
string pNumObj = ""; string pNumObj = "";
......
...@@ -859,6 +859,7 @@ extern "C" { ...@@ -859,6 +859,7 @@ extern "C" {
EXPORTS int eyemReleaseModel(IntPtr &hModelID); EXPORTS int eyemReleaseModel(IntPtr &hModelID);
EXPORTS int eyemTrackFeature(EyemImage tpPrevImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum, int *ipResults, EyemImage *tpDstImg); EXPORTS int eyemTrackFeature(EyemImage tpPrevImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum, int *ipResults, EyemImage *tpDstImg);
EXPORTS int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum); EXPORTS int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, int iRoiNum);
EXPORTS int eyemAllMethodTest(EyemImage tpImage);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -4332,10 +4332,61 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4332,10 +4332,61 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//计数图像 //计数图像
cv::Mat lbMat(Y, X, CV_8UC1, cv::Scalar(0)); cv::Mat lbMat(Y, X, CV_8UC1, cv::Scalar(0));
//测试用,根据模板尺寸顶帽处理,去掉中间料盘
int minPart = cv::min(tplWidth, tplHeight);
cv::Mat srcPrevWithMask(Y, X, CV_8UC1);
srcPrev.copyTo(srcPrevWithMask);
if (minPart < 12) {
cv::Mat srcPrevEx;
cv::morphologyEx(srcPrev, srcPrevEx, cv::MORPH_TOPHAT, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(minPart, minPart)));
//
cv::Mat srcPrevExb;
cv::threshold(srcPrevEx, srcPrevExb, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
//膨胀
cv::morphologyEx(srcPrevExb, srcPrevExb, cv::MORPH_DILATE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(minPart, minPart)));
//去掉盘本身的影响
srcPrevWithMask = cv::Scalar(255 - backT);
srcPrev.copyTo(srcPrevWithMask, srcPrevExb);
}
//使用大料算法(模板匹配方式) //使用大料算法(模板匹配方式)
cv::threshold(srcPrev, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); cv::threshold(srcPrev, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
//去掉小于5个像素的干扰
cv::Mat labels0, stats0, centroids0;
int nccomps0 = cv::connectedComponentsWithStats(binary, labels0, stats0, centroids0, 4);
//过滤连通域面积及长/宽比例不符合的,允许50%误差
std::vector<uchar> colors0(nccomps0 + 1, 0);
for (int i = 1; i < nccomps0; i++) {
colors0[i] = 255;
if ((stats0.ptr<int>(i)[cv::CC_STAT_AREA] < 10))
{
colors0[i] = 0;
}
}
//过滤
cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range& range)->void {
for (int y = range.start; y < range.end; y++)
{
uint8_t *ptrRow = binary.ptr<uint8_t>(y);
for (int x = 0; x < X; x++)
{
int label = labels0.ptr<int>(y)[x];
CV_Assert(0 <= label && label <= nccomps0);
ptrRow[x] = colors0[label];
}
}
});
cv::Mat srcPrevEx0; cv::Mat srcPrevEx0;
//连接
cv::morphologyEx(binary, srcPrevEx0, cv::MORPH_CLOSE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(95, 95))); cv::morphologyEx(binary, srcPrevEx0, cv::MORPH_CLOSE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(95, 95)));
//定位料盘中心 //定位料盘中心
...@@ -4376,6 +4427,21 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4376,6 +4427,21 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
} }
} }
//面积小于50000判断不是中心
if (contourMaxArea < 50000) {
cv::findContours(image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
//最大轮廓
for (int i = 1; i < contours.size(); i++)
{
double contourArea = cv::contourArea(contours[i]);
if (contourArea > contourMaxArea)
{
contourMax = contours[i];
contourMaxArea = contourArea;
}
}
}
//质心 //质心
cv::Moments mu = cv::moments(contourMax); cv::Moments mu = cv::moments(contourMax);
cv::Point2f reelCenter(float(mu.m10 / mu.m00), float(mu.m01 / mu.m00)); cv::Point2f reelCenter(float(mu.m10 / mu.m00), float(mu.m01 / mu.m00));
...@@ -4399,6 +4465,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4399,6 +4465,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
} }
} }
//去掉料盘中心
cv::circle(srcPrevWithMask, cv::Point(reelCenter), 150, cv::Scalar(255 - backT), -1);
cv::Rect rec = cv::boundingRect(contourMax); cv::Rect rec = cv::boundingRect(contourMax);
//顶点坐标 //顶点坐标
...@@ -4421,7 +4490,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4421,7 +4490,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
{ {
//模板匹配(仅处理料盘区域以提高速度) //模板匹配(仅处理料盘区域以提高速度)
cv::Mat tplResult0; cv::Mat tplResult0;
cv::matchTemplate(srcPrev(cv::Rect(tl, br)), getTplMat(tplMat, icvDirections[tpl], (255 - backT)), tplResult0, cv::TM_CCOEFF_NORMED); cv::matchTemplate(srcPrevWithMask(cv::Rect(tl, br)), getTplMat(tplMat, icvDirections[tpl], (255 - backT)), tplResult0, cv::TM_CCOEFF_NORMED);
//分数大于一定分数才当作元件处理 //分数大于一定分数才当作元件处理
tplResult0 = cv::Mat(tplResult0 > matchDeg); tplResult0 = cv::Mat(tplResult0 > matchDeg);
...@@ -4454,10 +4523,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char ...@@ -4454,10 +4523,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//旋转图像,计算另外四个方向的起点 //旋转图像,计算另外四个方向的起点
float matx[6]; float matx[6];
cv::Mat srcPrev45 = getTrackMat(srcPrev(cv::Rect(tl, br)), 45.0, 0, matx); cv::Mat srcPrev45 = getTrackMat(srcPrevWithMask(cv::Rect(tl, br)), 45.0, 0, matx);
cv::Mat showMat2; /*cv::Mat showMat2;
cv::cvtColor(srcPrev(cv::Rect(tl, br)), showMat2, cv::COLOR_GRAY2BGRA); cv::cvtColor(srcPrev(cv::Rect(tl, br)), showMat2, cv::COLOR_GRAY2BGRA);*/
cv::parallel_for_(cv::Range(0, 4), [&](const cv::Range& range)->void { cv::parallel_for_(cv::Range(0, 4), [&](const cv::Range& range)->void {
for (int tpl = range.start; tpl < range.end; tpl++) for (int tpl = range.start; tpl < range.end; tpl++)
...@@ -5800,4 +5869,15 @@ int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, i ...@@ -5800,4 +5869,15 @@ int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, i
cv::waitKey(1); cv::waitKey(1);
return FUNC_OK; return FUNC_OK;
}
int eyemAllMethodTest(EyemImage tpImage)
{
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;
return FUNC_OK;
} }
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!