Commit 84029fbf 张士柳

1 个父辈 19dd9381
......@@ -921,7 +921,7 @@ namespace eyemLib_Sharp
string file = fileName.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries)[2];
//获取用于制作模板的图像
flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
//flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
//Bitmap bmp = eyemCvtToBitmap(tpDstImg);
......@@ -932,31 +932,32 @@ namespace eyemLib_Sharp
//创建模板匹配模型
EyemRect tpRoi2 = new EyemRect();
tpRoi2.iXs = 1112; tpRoi2.iYs = 414;
tpRoi2.iWidth = 68;
tpRoi2.iHeight = 79;
tpRoi2.iXs = 1026; tpRoi2.iYs = 513;
tpRoi2.iWidth = 41;
tpRoi2.iHeight = 14;
//double matchDeg = 0.75;
//flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D://模板文件//" + file.Replace(".png", ".tpl"));
double matchDeg = 0.75;
//flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
string selectModel = "";
flag = eyemMatchTemplateModel(tpDstImg, "D:\\模板文件", ref selectModel);
//string selectModel = "";
//flag = eyemMatchTemplateModel(tpDstImg, "D:\\模板文件", ref selectModel);
//最好释放掉
eyemImageFree(ref tpDstImg);
//eyemImageFree(ref tpDstImg);
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS",""
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), 35, 0, 100, 5, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), 0.1, "IP_LARGE_PARTS", 100, 7, ref pNumObj, out tpDstImg);
//eyemCountObjectE(image, tpRoi, fileName, ref pNumObj, out tpDstImg);
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);
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
if (bitmap != null)
{
bitmap.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
}
//if (bitmap != null)
//{
// bitmap.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
//}
////<解码测试
//int ipNum; EyemBarCode* tpResults;
......@@ -1036,7 +1037,6 @@ namespace eyemLib_Sharp
hObject.Dispose();
}
//
public static void toSingleFilter(int[] iArrRes, ref int[] bitSingle)
{
for (int i = 0; i < iArrRes.Length; i++)
......
......@@ -23,9 +23,12 @@ namespace eyemLib_Sharp
//}
//EyemLib.eyemTest2(fileNames);
foreach (var item in fileNames)
for (int i = 0; i < 10000; i++)
{
EyemLib.eyemReadImageTool(item);
foreach (var item in fileNames)
{
EyemLib.eyemReadImageTool(item);
}
}
......
......@@ -74,16 +74,16 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>D:\opencv420\build\include;D:\opencv420\build\include\opencv2;D:\zxing-cpp-master\core\src;D:\zxing-cpp-master\opencv\src;$(IncludePath)</IncludePath>
<LibraryPath>D:\opencv420\build\x64\vc14\lib;D:\zxing-cpp-master\build\Debug;$(LibraryPath)</LibraryPath>
<IncludePath>D:\opencv420\build\include;D:\opencv420\build\include\opencv2;D:\zxing-cpp-master\core\src;D:\zxing-cpp-master\opencv\src;D:\tbb2017_20170604oss\include;$(IncludePath)</IncludePath>
<LibraryPath>D:\opencv420\build\x64\vc14\lib;D:\zxing-cpp-master\build\Debug;D:\tbb2017_20170604oss\lib\intel64\vc14;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>D:\opencv420\build\include;D:\opencv420\build\include\opencv2;D:\zxing-cpp-master\core\src;D:\zxing-cpp-master\opencv\src;$(IncludePath)</IncludePath>
<LibraryPath>D:\opencv420\build\x64\vc14\lib;D:\zxing-cpp-master\build\Release;$(LibraryPath)</LibraryPath>
<IncludePath>D:\opencv420\build\include;D:\opencv420\build\include\opencv2;D:\zxing-cpp-master\core\src;D:\zxing-cpp-master\opencv\src;D:\tbb2017_20170604oss\include;$(IncludePath)</IncludePath>
<LibraryPath>D:\opencv420\build\x64\vc14\lib;D:\zxing-cpp-master\build\Release;D:\tbb2017_20170604oss\lib\intel64\vc14;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
......
......@@ -144,6 +144,12 @@ static cv::Mat getTrackMat(cv::Mat &trackMat, double t, int val, float *matx)
return tplMatD;
}
void f();
extern void bar(int templateMatchMode) {
}
/** 模板追踪匹配
image 输入图像
tplMat 输入模板
......@@ -190,6 +196,16 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
}
});
//tbb::parallel_for(tbb::blocked_range<int>(0, 2), [&](tbb::blocked_range<int>& range) {
// for (int m = range.begin(); m < range.end(); m++)
// {
// cv::Mat tplResult;
// cv::matchTemplate(trackMats[m], tplMats[m], tplResult, icvTemplateMatchModes[m]);
// tplResults[icvTemplateMatchModes[m]] = tplResult;
// }
//});
cv::Mat tplResult0 = tplResults[5] - tplResults[1];
//计算极值坐标
......@@ -4055,6 +4071,8 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
if (src.empty()) {
return FUNC_IMAGE_NOT_EXIST;
}
double begin0 = (double)cv::getTickCount();
//转单通道图像
if (src.channels() != 1)
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
......@@ -4112,21 +4130,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
cv::minMaxIdx(hist, NULL, NULL, NULL, maxIdx);
//背景阈值
int backThresh = 15 * (maxIdx[0] - 2);
//去掉背景
cv::parallel_for_(cv::Range(0, Y), [&](const cv::Range range)->void {
for (int y = range.start; y < range.end; y++)
{
for (int x = 0; x < X; x++)
{
if ((src8U.data)[(x)+(y)*X] >= backThresh)
{
(src8U.data)[(x)+(y)*X] = backThresh;
}
}
}
src8U.forEach<uint8_t>([&](uint8_t& pixel, const int *pos)->void {
pixel = pixel >= backThresh ? backThresh : pixel;
});
//增强到目标亮度
//增强到目标亮度,用于显示
cc += cv::Scalar((162 - backThresh), (162 - backThresh), (162 - backThresh));
//去掉干扰
......@@ -4259,17 +4269,12 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
});
///<追踪元件算法
//标记初始区域
//计算初始起点
std::vector<cv::Point> matchPts;
cv::findNonZero(matchParts, matchPts);
#ifdef _DEBUG
//计算元件间距(弦长)
/*
已知弦长L和半径R求角度2A:
sinA=(1/2)*L/R=L/(2R),2A=2asin(L/(2R)).
*/
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));
......@@ -4367,7 +4372,49 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
}
}
///<开始两个方向追踪流程
//std::cout << "除追踪之外耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
//大于3个起点坐标排序
if (matchPts.size() > 3) {
std::vector<Track> tMatchPts;
for (std::vector<cv::Point>::iterator itv = matchPts.begin(); itv != matchPts.end(); ++itv)
{
cv::Point2f startCenter((float)(*itv).x, (float)(*itv).y);
tMatchPts.push_back(Track(0, 0, cv::norm(startCenter - reelCenter), cv::Point(startCenter), std::vector<cv::Point2f>()));
}
//按照距离排序
std::sort(tMatchPts.begin(), tMatchPts.end(), std::greater<Track>());
std::vector<cv::Point> sortedMatchPts;
int len = cvRound((double)tMatchPts.size() / 2.0);
for (int i = 0; i < len; i++)
{
int beforeidx = (len * 3 - i) % tMatchPts.size();
int afteridx = (len * 3 + i) % tMatchPts.size();
if (beforeidx == afteridx) {
sortedMatchPts.push_back(tMatchPts[afteridx].Pos);
}
else {
sortedMatchPts.push_back(tMatchPts[afteridx].Pos);
sortedMatchPts.push_back(tMatchPts[beforeidx].Pos);
}
}
//偶数个
if (tMatchPts.size() % 2 == 0) {
sortedMatchPts.push_back(tMatchPts[0].Pos);
}
//容器内容互换
sortedMatchPts.swap(matchPts);
}
///<开始顺时针与逆时针两个方向追踪流程
for (std::vector<cv::Point>::iterator itv = matchPts.begin(); itv != matchPts.end(); ++itv)
{
//追踪起点
......@@ -4423,10 +4470,14 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//偏移角度(元件尺寸)
const double dOffset = (2 * asin(2 * trackLength / (2 * startRadius))) * 180. / PI;
//并行处理
//#pragma omp parallel sections
//考虑作并行处理
tbb::parallel_invoke(
[&]
{
//#pragma omp section //(顺时针)
std::cout << tbb::this_tbb_thread::get_id() << std::endl;
#pragma region //(顺时针)
{
//追踪中心
cv::Point2f trackCenter = cv::Point2f(startCenter.x, startCenter.y);
......@@ -4484,7 +4535,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
///<开始离心/向心扫描(横向由于存在间隔所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
......@@ -4586,8 +4637,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
trackEnd = (!found);
} while (!trackEnd);
}
#pragma endregion
},
[&]
{
std::cout << tbb::this_tbb_thread::get_id() << std::endl;
#pragma region //(逆时针)
//#pragma omp section //(逆时针)
{
//追踪起点
cv::Point2f trackCenter(startCenter.x, startCenter.y);
......@@ -4640,7 +4698,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//更新扫描角度
trackAngle = atan2((double)trackCenter.y - reelCenter.y, (double)trackCenter.x - reelCenter.x) * 180 / PI;
///<开始离心/向心扫描(横向由于存在间隔所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
calcRotateRect(trackCenter, (float)trackAngle, (float)trackLength, (float)trackWidth, pts);
......@@ -4742,7 +4800,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
trackEnd = (!found);
} while (!trackEnd);
}
}
#pragma endregion
});
}
//计数
......@@ -5031,8 +5091,5 @@ int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, i
cv::Mat nextImg(tpNextImg.iHeight, tpNextImg.iWidth,
MAKETYPE(tpNextImg.iDepth, tpNextImg.iChannels), tpNextImg.vpImage);
return FUNC_OK;
}
\ No newline at end of file
......@@ -10,7 +10,7 @@
#include <direct.h>
#include "eyemLib.h"
#include <omp.h>
#include <tbb\tbb.h>
constexpr double c = PI / 180.;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!