1、添加检测程序启动后台管理方式

2、根据实际部署时发现的UI问题进行相关修复,UI展示相关
3、算法加入备注
master
bob.pan 5 years ago
parent bb525b5dd8
commit 77ea01979b

@ -1,4 +1,4 @@
/*! \file ImageCompareModel.cpp /*! \file ImageCompareModel.cpp
Copyright (C) 2014 Hangzhou Leaper. Copyright (C) 2014 Hangzhou Leaper.
@ -56,10 +56,7 @@ cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
{ {
for (float x = cen.x - r; x <= cen.x + r; x += 0.5) for (float x = cen.x - r; x <= cen.x + r; x += 0.5)
{ {
std::cout << "newCenter: " << x << "-" << y << ", ";
Point2f newCenter(x, y); Point2f newCenter(x, y);
vector<float> vec; vector<float> vec;
selfRotationSimilarityFeature(img, vec, newCenter); selfRotationSimilarityFeature(img, vec, newCenter);
@ -73,7 +70,6 @@ cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
#endif #endif
float diffVal = sum<float>(vec.begin(), vec.end()); float diffVal = sum<float>(vec.begin(), vec.end());
vec.push_back(diffVal); vec.push_back(diffVal);
if (minDiff > diffVal) if (minDiff > diffVal)
@ -82,11 +78,6 @@ cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
bestCenter = newCenter; bestCenter = newCenter;
bestDftVec = dftVec; bestDftVec = dftVec;
} }
std::cout << "diff: " << diffVal << ", "
" minDiff: " << minDiff << ", "
" bestCenter: " << bestCenter.x << "-" << bestCenter.y <<
std::endl;
} }
} }
@ -153,20 +144,19 @@ void ImageCompareModel::selfRotationSimilarityFeature(
fImg = fImg.mul(weightImg); fImg = fImg.mul(weightImg);
double sumVal = sum(weightImg).val[0]; double sumVal = sum(weightImg).val[0];
Mat baseImg; Mat baseImg;
{
Mat t = getRotationMatrix2D(center, 1.0, 1.0); Mat t = getRotationMatrix2D(center, 1.0, 1.0);
Mat rImg; Mat rImg;
warpAffine(fImg, rImg, t, fImg.size(), CV_INTER_CUBIC); warpAffine(fImg, rImg, t, fImg.size(), CV_INTER_CUBIC);
t = getRotationMatrix2D(center, -1.0, 1.0); t = getRotationMatrix2D(center, -1.0, 1.0);
warpAffine(rImg, baseImg, t, rImg.size(), CV_INTER_CUBIC); warpAffine(rImg, baseImg, t, rImg.size(), CV_INTER_CUBIC);
}
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat viewBaseImg = baseImg / 255.0/25.0; // #ifdef DEBUG_VIEW_INTERNAL_MAT
Mat viewfImg = fImg / 255.0/25.0; // Mat viewBaseImg = baseImg / 255.0/25.0;
#endif // Mat viewfImg = fImg / 255.0/25.0;
// #endif
for (float a = 0; a <= 360.0; a += angleStep) for (float a = 0; a <= 360.0; a += angleStep)
{ {
@ -211,11 +201,9 @@ cv::Mat ImageCompareModel::genMask(const Mat& img, Point2f center,
void ImageCompareModel::genMask() void ImageCompareModel::genMask()
{ {
m32fMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0)); m32fMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0));
m8uMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0), m8uMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0), -1.0, -1.0, CV_8UC1);
-1.0, -1.0, CV_8UC1);
m32fInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0)); m32fInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0));
m8uInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0), m8uInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0), -1.0, -1.0, CV_8UC1);
-1.0, -1.0, CV_8UC1);
} }
void ImageCompareModel::printInfo() void ImageCompareModel::printInfo()
@ -397,6 +385,7 @@ bool ImageCompareModel::readFromFile(string filePath)
} }
} }
//图像预处理
void ImageCompareModel::preProcessImage(Mat& img, Mat &insideImg) const void ImageCompareModel::preProcessImage(Mat& img, Mat &insideImg) const
{ {
preProcessImage(img, m8uMaskImg, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold); preProcessImage(img, m8uMaskImg, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
@ -407,8 +396,7 @@ void ImageCompareModel::preProcessImage(Mat& img, Mat &insideImg) const
preProcessImage(insideImg, m8uInsideMaskImg, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold); preProcessImage(insideImg, m8uInsideMaskImg, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
} }
void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, double tarMean, void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, double tarMean, double tarStddev, int highlightsThreshold) const
double tarStddev, int highlightsThreshold) const
{ {
if (img.channels() > 1) if (img.channels() > 1)
{ {
@ -418,33 +406,32 @@ void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, double tarMea
{ {
converToType(img, CV_32FC1); converToType(img, CV_32FC1);
} }
//高斯模糊 处理噪点
Mat gaussImg; Mat gaussImg;
GaussianBlur(img, gaussImg, Size(3, 3), 5.0); GaussianBlur(img, gaussImg, Size(3, 3), 5.0);
img = gaussImg; img = gaussImg;
//膨胀 扩大掩膜模板
Mat dilatedMask; Mat dilatedMask;
dilate(mask, dilatedMask, Mat::ones(Size(3, 3), CV_32FC1)); Mat kernel = Mat::ones(Size(3, 3), CV_8UC1);
dilate(mask, dilatedMask, kernel);
Mat hightlightsMask = img < highlightsThreshold; Mat hightlightsMask = img < highlightsThreshold;
Mat imgMask = hightlightsMask & dilatedMask; Mat imgMask = hightlightsMask & dilatedMask;
//计算图像像素均值 对检测图像做均衡
Scalar meanScalar, stddevScalar; Scalar meanScalar, stddevScalar;
meanStdDev(img, meanScalar, stddevScalar, imgMask); meanStdDev(img, meanScalar, stddevScalar, imgMask);
img = (img - meanScalar.val[0]) * tarStddev / stddevScalar.val[0] + tarMean; img = (img - meanScalar.val[0]) * tarStddev / stddevScalar.val[0] + tarMean;
//归一化处理图像 减少图像间差异
converToType(imgMask, CV_32FC1); converToType(imgMask, CV_32FC1);
imgMask /= 255.0; imgMask /= 255.0;
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0), Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0), imgMask, 125);
imgMask, 125);
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vImgNorm = imgNorm / 255.0;
#endif
img = imgNorm; img = imgNorm;
} }
void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, const Mat& weightMat, double dstMean, double dstStddev, int highlightsThreshold) const
const Mat& weightMat, double dstMean, double dstStddev, int highlightsThreshold) const
{ {
if (img.channels() > 1) if (img.channels() > 1)
{ {
@ -465,20 +452,11 @@ void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask,
Scalar meanScalar, stddevScalar; Scalar meanScalar, stddevScalar;
meanStdDev(img, meanScalar, stddevScalar, imgMask); meanStdDev(img, meanScalar, stddevScalar, imgMask);
img = (img - meanScalar.val[0]) * dstStddev / stddevScalar.val[0] + dstMean; img = (img - meanScalar.val[0]) * dstStddev / stddevScalar.val[0] + dstMean;
//img.setTo(0, img < 0);
converToType(hightlightsMask, CV_32FC1);
//converToType(imgMask, CV_32FC1);
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0),
weightMat.mul(hightlightsMask), 125);
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vImgNorm = imgNorm / 255.0;
#endif
img = imgNorm;
}
void ImageCompareModel::preProcessImage0(Mat& img) const converToType(hightlightsMask, CV_32FC1);
{
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0), weightMat.mul(hightlightsMask), 125);
img = imgNorm;
} }
double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1) double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1)
@ -492,7 +470,6 @@ double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1)
int bestAngle = -1; int bestAngle = -1;
Mat bestImg1; Mat bestImg1;
double bestDD = 0; double bestDD = 0;
double w = 0; double w = 0;
Point2f center((float)img1.cols / 2.0, (float)img1.rows / 2.0); Point2f center((float)img1.cols / 2.0, (float)img1.rows / 2.0);
@ -510,10 +487,9 @@ double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1)
{ {
*pRImg1 = rImg1; *pRImg1 = rImg1;
} }
return genMatchValue(dMat); return genMatchValue(dMat);
} }
//匹配比较
double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int levelNum /*= 1*/, double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int levelNum /*= 1*/,
bool isFilterSize /*= true*/, int flag, double md_diameter, double md_height) bool isFilterSize /*= true*/, int flag, double md_diameter, double md_height)
{ {
@ -528,16 +504,13 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
int x_Axis = srcImage.cols / 2 - MAX_CIRCLE_RADII; int x_Axis = srcImage.cols / 2 - MAX_CIRCLE_RADII;
int y_Axis = srcImage.rows / 2 - MAX_CIRCLE_RADII; int y_Axis = srcImage.rows / 2 - MAX_CIRCLE_RADII;
int r_Axis = 2 * MAX_CIRCLE_RADII; int r_Axis = 2 * MAX_CIRCLE_RADII;
if (x_Axis <= 0 || y_Axis <= 0) if (x_Axis <= 0 || y_Axis <= 0)
return DBL_MAX; return DBL_MAX;
if (r_Axis <= 0) if (r_Axis <= 0)
return DBL_MAX; return DBL_MAX;
if (r_Axis >= srcImage.cols || r_Axis >= srcImage.rows) if (r_Axis >= srcImage.cols || r_Axis >= srcImage.rows)
return DBL_MAX; return DBL_MAX;
if (srcImage.cols < (srcImage.cols / 2 + MAX_CIRCLE_RADII) || srcImage.rows < (srcImage.rows / 2 + MAX_CIRCLE_RADII)) if (srcImage.cols < (srcImage.cols / 2 + MAX_CIRCLE_RADII) || srcImage.rows < (srcImage.rows / 2 + MAX_CIRCLE_RADII))
return DBL_MAX; return DBL_MAX;
@ -548,11 +521,11 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
resizeMat(srcImage, img); resizeMat(srcImage, img);
resizeMat(srcCenterMat, centerMat); resizeMat(srcCenterMat, centerMat);
Mat rawImg = img.clone(); Mat rawImg = img.clone();
int nRadiusDiff = 15; int nRadiusDiff = 15;//过滤图像尺寸和模板尺寸不匹配的动作
if (mAlignBaseImg.size() != img.size() || mInSideBaseImg.size() !=centerMat.size()) if (mAlignBaseImg.size() != img.size() || mInSideBaseImg.size() !=centerMat.size())
{ {
if (isFilterSize \ if (isFilterSize
&& abs(mAlignBaseImg.size().width - img.size().width) > nRadiusDiff \ && abs(mAlignBaseImg.size().width - img.size().width) > nRadiusDiff
|| abs(mInSideBaseImg.size().width - centerMat.size().width) > 3) || abs(mInSideBaseImg.size().width - centerMat.size().width) > 3)
{ {
return DBL_MAX; return DBL_MAX;
@ -561,79 +534,57 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
resize(centerMat, centerMat, mInSideBaseImg.size()); resize(centerMat, centerMat, mInSideBaseImg.size());
} }
Mat matchImg = img.clone(); //抠出需要检测的图像
Mat matchInsideImg = centerMat.clone(); Mat matchImg = img.clone();//辐条部位
Mat matchInsideImg = centerMat.clone();//圆心部位
preProcessImage(matchImg, matchInsideImg);
preProcessImage(matchImg, matchInsideImg);//图像预处理
// Mat s = matchImg / 255.0;
// imwrite("11.png", s);
if (!mpMultiScaleModel) if (!mpMultiScaleModel)
{ {
initMultiScaleModel(); initMultiScaleModel();
} }
m_parallelFlag = 0; m_parallelFlag = 0;
RotateMatchResult rmr = rotateMatch(matchImg, levelNum); RotateMatchResult rmr = rotateMatch(matchImg, levelNum);//旋转图像,计算最佳旋转角度
Mat rImg = rmr.mBestRImg; Mat rImg = rmr.mBestRImg;
m_parallelFlag = 1; m_parallelFlag = 1;
RotateMatchResult rmmInside = rotateMatch(matchInsideImg, 1); RotateMatchResult rmmInside = rotateMatch(matchInsideImg, 1);//旋转图像,计算最佳旋转角度
Mat rInsideImg = rmmInside.mBestRImg; Mat rInsideImg = rmmInside.mBestRImg;
if (rImg.empty() || rInsideImg.empty()) if (rImg.empty() || rInsideImg.empty())
{ {
return DBL_MAX; return DBL_MAX;
} }
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vRImg = rImg / 255.0;
Mat vInsideMat = rInsideImg / 255.0;
#endif
double bestAngle = rmr.mBestAngle; double bestAngle = rmr.mBestAngle;
Mat cmpImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0), Mat cmpImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0), bestAngle);//旋转图像
bestAngle);
// remove highlights // remove highlights 去除高光影响
Mat hightlightsMask = cmpImg < mHighlightsThreshold; Mat hightlightsMask = cmpImg < mHighlightsThreshold;
converToType(hightlightsMask, CV_32FC1); converToType(hightlightsMask, CV_32FC1);
hightlightsMask /= 255.0; hightlightsMask /= 255.0;
Mat unifiedMask = m32fMaskImg.mul(hightlightsMask).mul(mWeightMat); Mat unifiedMask = m32fMaskImg.mul(hightlightsMask).mul(mWeightMat);
//Mat ii = mWeightMat / 255.0; preProcessImage(cmpImg, m8uMaskImg, mWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
preProcessImage(cmpImg, m8uMaskImg, mWeightMat, mTargetMeanVal,
mTargetStddevVal, mHighlightsThreshold);
cmpImg.setTo(0, cmpImg < 0); cmpImg.setTo(0, cmpImg < 0);
converToType(cmpImg, CV_32FC1); converToType(cmpImg, CV_32FC1);
normSectors_tarImg(cmpImg, unifiedMask, imgCen(cmpImg), 1, normSectors_tarImg(cmpImg, unifiedMask, imgCen(cmpImg), 1, mCompareBaseImg);
mCompareBaseImg);
double bestInsideAngle = rmmInside.mBestAngle; double bestInsideAngle = rmmInside.mBestAngle;
Mat camInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), Mat camInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), bestInsideAngle);
bestInsideAngle);
Mat highLightInsideMask = camInsideMat < mHighlightsThreshold; Mat highLightInsideMask = camInsideMat < mHighlightsThreshold;
converToType(highLightInsideMask, CV_32FC1); converToType(highLightInsideMask, CV_32FC1);
highLightInsideMask /= 255.0; highLightInsideMask /= 255.0;
Mat unifiedInsideMask = m32fInsideMaskImg.mul(highLightInsideMask).mul(mInsideWeightMat); Mat unifiedInsideMask = m32fInsideMaskImg.mul(highLightInsideMask).mul(mInsideWeightMat);
preProcessImage(camInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, preProcessImage(camInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
mTargetStddevVal, mHighlightsThreshold);
Mat vcamInside = camInsideMat / 255.0; Mat vcamInside = camInsideMat / 255.0;
camInsideMat.setTo(0, camInsideMat < 0); camInsideMat.setTo(0, camInsideMat < 0);
//mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0); //mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0);
normSectors_tarImg(camInsideMat, unifiedInsideMask, imgCen(camInsideMat), 1, mInsideCompareBaseImg); normSectors_tarImg(camInsideMat, unifiedInsideMask, imgCen(camInsideMat), 1, mInsideCompareBaseImg);
//
mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0); mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0);
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vRotatedImg0 = cmpImg / 255.0;
Mat vrotatedInsideImage = camInsideMat / 255.0;
cv::imwrite("F:\\temp\\insideAfterSector.png", camInsideMat);
#endif
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vRotatedImg1 = mCompareBaseImg / 255.0;
Mat vrotatedInsideBase = mInsideCompareBaseImg / 255.0;
cv::imwrite("F:\\temp\\insideAfterSectorCompareBase.png", mInsideCompareBaseImg);
#endif
cmpImg.setTo(0, cmpImg < 10); cmpImg.setTo(0, cmpImg < 10);
//camInsideMat.setTo(0, camInsideMat < 10); //camInsideMat.setTo(0, camInsideMat < 10);
@ -642,10 +593,14 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
*pRImg = cmpImg; *pRImg = cmpImg;
} }
m_parallelFlag = 0; m_parallelFlag = 0;
double ret = genMatchValue(cmpImg, mCompareBaseImg, unifiedMask, flag, rawImg.rows, md_diameter, md_height);//得出相似值 Mat s1 = cmpImg / 255.0;
Mat s2 = mCompareBaseImg / 255.0;
Mat s3 = unifiedMask / 255.0;
Mat s4 = rawImg / 255.0;
double ret = genMatchValue(cmpImg, mCompareBaseImg, unifiedMask, flag, rawImg.rows, md_diameter, md_height);//得出相似值
m_parallelFlag = 1; m_parallelFlag = 1;
double retInside = genMatchValue(camInsideMat, mInsideCompareBaseImg, unifiedInsideMask, 0, rawImg.rows, md_diameter, md_height);//得出相似值 double retInside = genMatchValue(camInsideMat, mInsideCompareBaseImg, unifiedInsideMask, 0, rawImg.rows, md_diameter, md_height);//得出相似值
ret = 0.6*ret + 0.4*retInside; ret = 0.6*ret + 0.4*retInside;
@ -695,32 +650,32 @@ void ImageCompareModel::train(const vector<Mat>& vec)
Vec3f bestCircle; Vec3f bestCircle;
Point2f p = Point2f(originalMat.cols / 2.0, originalMat.rows / 2.0); Point2f p = Point2f(originalMat.cols / 2.0, originalMat.rows / 2.0);
// cd.detectBest(originalMat, Point2f(originalMat.cols / 2.0, originalMat.rows / 2.0), bestCircle, nullptr); // cd.detectBest(originalMat, Point2f(originalMat.cols / 2.0, originalMat.rows / 2.0), bestCircle, nullptr);
#ifdef DEBUG_VIEW_INTERNAL_MAT // #ifdef DEBUG_VIEW_INTERNAL_MAT
Mat img1 = vec.front().clone(); // Mat img1 = vec.front().clone();
Mat img2 = vec.front().clone(); // Mat img2 = vec.front().clone();
vector<Mat> vecs; // vector<Mat> vecs;
vecs.push_back(originalMat); // vecs.push_back(originalMat);
vecs.push_back(originalMat); // vecs.push_back(originalMat);
vecs.push_back(originalMat); // vecs.push_back(originalMat);
Mat rr; // Mat rr;
merge(vecs, rr); // merge(vecs, rr);
//
circle(rr, Point2f(bestCircle[0], bestCircle[1]), bestCircle[2], Scalar(255, 0, 0), 2); // circle(rr, Point2f(bestCircle[0], bestCircle[1]), bestCircle[2], Scalar(255, 0, 0), 2);
vector<Mat> imgVec; // vector<Mat> imgVec;
resizeVecMat(vec, imgVec); // resizeVecMat(vec, imgVec);
vector<Mat> vecss; // vector<Mat> vecss;
vecss.push_back(originalMat); // vecss.push_back(originalMat);
vecss.push_back(originalMat); // vecss.push_back(originalMat);
vecss.push_back(originalMat); // vecss.push_back(originalMat);
Mat rrr; // Mat rrr;
merge(vecss, rrr); // merge(vecss, rrr);
//
// circle(rrr, Point2f(bestCircle[0] / COLS_SCALE, bestCircle[1] / COLS_SCALE), rInner, Scalar(255, 0, 0), 1); // // circle(rrr, Point2f(bestCircle[0] / COLS_SCALE, bestCircle[1] / COLS_SCALE), rInner, Scalar(255, 0, 0), 1);
#endif // DEBUG_VIEW_INTERNAL_MAT // #endif // DEBUG_VIEW_INTERNAL_MAT
//bob edit //bob edit
float startX = originalMat.cols / 2.0 - MAX_CIRCLE_RADII;//找最大圆外径,固定直径 float startX = originalMat.cols / 2.0 - MAX_CIRCLE_RADII;//找最大圆外径,固定直径
float startY = originalMat.rows / 2.0 - MAX_CIRCLE_RADII; float startY = originalMat.rows / 2.0 - MAX_CIRCLE_RADII;
Rect rect(startX, startY, MAX_CIRCLE_RADII * 2, MAX_CIRCLE_RADII * 2); Rect rect(startX, startY, MAX_CIRCLE_RADII * 2, MAX_CIRCLE_RADII * 2);
Mat origianlCenterMat; Mat origianlCenterMat;
@ -767,7 +722,7 @@ void ImageCompareModel::train(const vector<Mat>& vec)
mInSideBaseImg = scaledCenterVec.front(); mInSideBaseImg = scaledCenterVec.front();
genMask(); genMask();
preProcessImage(mAlignBaseImg, mInSideBaseImg);//预处理 光照均衡 preProcessImage(mAlignBaseImg, mInSideBaseImg);//预处理 光照均衡
Mat sumOutsideMat = Mat::zeros(mAlignBaseImg.size(), CV_32FC1); Mat sumOutsideMat = Mat::zeros(mAlignBaseImg.size(), CV_32FC1);
Mat sumInsideMat = Mat::zeros(mInSideBaseImg.size(), CV_32FC1); Mat sumInsideMat = Mat::zeros(mInSideBaseImg.size(), CV_32FC1);
Mat minOutsideMat(mAlignBaseImg.size(), mAlignBaseImg.type()); Mat minOutsideMat(mAlignBaseImg.size(), mAlignBaseImg.type());
@ -807,7 +762,7 @@ void ImageCompareModel::train(const vector<Mat>& vec)
//Mat insideImg = img.clone(); //Mat insideImg = img.clone();
preProcessImage(img, centerMat); preProcessImage(img, centerMat);
m_parallelFlag = 0; m_parallelFlag = 0;
RotateMatchResult rmr = rotateMatch(img);//旋转匹配 输出匹配完成的角度及图片 RotateMatchResult rmr = rotateMatch(img);//旋转匹配 输出匹配完成的角度及图片
rmrVec.push_back(rmr); rmrVec.push_back(rmr);
m_parallelFlag = 1; m_parallelFlag = 1;
RotateMatchResult rmrInside = rotateMatch(centerMat); RotateMatchResult rmrInside = rotateMatch(centerMat);
@ -819,7 +774,7 @@ void ImageCompareModel::train(const vector<Mat>& vec)
Mat rInsideImg = rmrInside.mBestRImg; Mat rInsideImg = rmrInside.mBestRImg;
rInsideImgVec.push_back(rInsideImg); rInsideImgVec.push_back(rInsideImg);
//minMat = min(minMat, rImg); //minMat = min(minMat, rImg);
minOutsideMat = min(minOutsideMat, rImg);//生成权重图 去毛刺 minOutsideMat = min(minOutsideMat, rImg);//生成权重图 去毛刺
sumOutsideMat += rImg; sumOutsideMat += rImg;
minInsideMat = min(minInsideMat, rInsideImg); minInsideMat = min(minInsideMat, rInsideImg);
@ -848,14 +803,13 @@ void ImageCompareModel::train(const vector<Mat>& vec)
mWeightMat /= 255.0; mWeightMat /= 255.0;
mInsideWeightMat = minInsideMat; mInsideWeightMat = minInsideMat;
mInsideWeightMat /= 255.0; mInsideWeightMat /= 255.0;
/*luffy_base::luffy_imageProc::*/meanvarnorm(mWeightMat, mWeightMat,//对权重进行 归一化
mTargetMeanVal, 150, m8uMaskImg); //对权重进行 归一化
meanvarnorm(mWeightMat, mWeightMat, mTargetMeanVal, 150, m8uMaskImg);
mWeightMat.setTo(0, mWeightMat < 10); mWeightMat.setTo(0, mWeightMat < 10);
Scalar meanScalar, stddevScalar; Scalar meanScalar, stddevScalar;
meanStdDev(mInsideWeightMat, meanScalar, stddevScalar, m8uInsideMaskImg); meanStdDev(mInsideWeightMat, meanScalar, stddevScalar, m8uInsideMaskImg);
mInsideWeightMat = mInsideWeightMat* (127 / meanScalar.val[0]); mInsideWeightMat = mInsideWeightMat* (127 / meanScalar.val[0]);
//luffy_base::luffy_imageProc::meanvarnorm(mInsideWeightMat, mInsideWeightMat,
// mTargetMeanVal, 50, m8uInsideMaskImg);
mInsideWeightMat.setTo(0, mInsideWeightMat < 0); mInsideWeightMat.setTo(0, mInsideWeightMat < 0);
{ {
@ -884,25 +838,22 @@ void ImageCompareModel::train(const vector<Mat>& vec)
{ {
double bestAngle = rmrVec[i].mBestAngle; double bestAngle = rmrVec[i].mBestAngle;
Mat img = resizedImgVec[i]; Mat img = resizedImgVec[i];
Mat rotatedImg = rotateImage(img, Point2f(img.cols/2.0, img.rows/2.0), Mat rotatedImg = rotateImage(img, Point2f(img.cols/2.0, img.rows/2.0), bestAngle);
bestAngle);
preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal, preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
mTargetStddevVal, mHighlightsThreshold);
double bestInsidePart = rmrVecInside[i].mBestAngle; double bestInsidePart = rmrVecInside[i].mBestAngle;
//Mat i_Mat = resizedImgVec[i]; //Mat i_Mat = resizedImgVec[i];
Mat centerMat = resizedCenterVec[i]; Mat centerMat = resizedCenterVec[i];
Mat rotatedInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), bestInsidePart); Mat rotatedInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), bestInsidePart);
preProcessImage(rotatedInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, preProcessImage(rotatedInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
mTargetStddevVal, mHighlightsThreshold);
sumOutsideMat += rotatedImg; sumOutsideMat += rotatedImg;
//rotatedInsideMat.setTo(0, rotatedInsideMat < 0); //rotatedInsideMat.setTo(0, rotatedInsideMat < 0);
sumInsideMat += rotatedInsideMat; sumInsideMat += rotatedInsideMat;
} }
mCompareBaseImg = sumOutsideMat / resizedImgVec.size();//得到最终匹配图 mCompareBaseImg = sumOutsideMat / resizedImgVec.size();//得到最终匹配图
mInsideCompareBaseImg = sumInsideMat / resizedImgVec.size(); mInsideCompareBaseImg = sumInsideMat / resizedImgVec.size();
#ifdef DEBUG_VIEW_INTERNAL_MAT #ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vCompareBaseImg = mCompareBaseImg / 255.0; Mat vCompareBaseImg = mCompareBaseImg / 255.0;
@ -931,8 +882,7 @@ void ImageCompareModel::trueSampleWeightRecon(const vector<Mat>& resizedVec,
const Mat &img = resizedVec[i]; const Mat &img = resizedVec[i];
double bestAngle = rmrVec[i].mBestAngle; double bestAngle = rmrVec[i].mBestAngle;
//preProcessImage(processedImg, insideMatchImg); //preProcessImage(processedImg, insideMatchImg);
Mat rotatedImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0), Mat rotatedImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0), bestAngle);
bestAngle);
Mat hightlightsMask = rotatedImg < mHighlightsThreshold; Mat hightlightsMask = rotatedImg < mHighlightsThreshold;
converToType(hightlightsMask, CV_32FC1); converToType(hightlightsMask, CV_32FC1);
@ -940,8 +890,7 @@ void ImageCompareModel::trueSampleWeightRecon(const vector<Mat>& resizedVec,
Mat unifiedMask = m32fMaskImg.mul(hightlightsMask).mul(mWeightMat); Mat unifiedMask = m32fMaskImg.mul(hightlightsMask).mul(mWeightMat);
preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal, preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
mTargetStddevVal, mHighlightsThreshold);
rotatedImg.setTo(0, rotatedImg < 0); rotatedImg.setTo(0, rotatedImg < 0);
converToType(rotatedImg, CV_32FC1); converToType(rotatedImg, CV_32FC1);
@ -955,15 +904,13 @@ void ImageCompareModel::trueSampleWeightRecon(const vector<Mat>& resizedVec,
////// FOR INSIDE CIRCLE ////// FOR INSIDE CIRCLE
double insideBestAngle = rmrVecInside[i].mBestAngle; double insideBestAngle = rmrVecInside[i].mBestAngle;
const Mat & centerMat = resizedCenterVec[i]; const Mat & centerMat = resizedCenterVec[i];
Mat rotatedInsideImg = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), Mat rotatedInsideImg = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), insideBestAngle);
insideBestAngle);
Mat highLightInsideMask = rotatedInsideImg < mHighlightsThreshold; Mat highLightInsideMask = rotatedInsideImg < mHighlightsThreshold;
converToType(highLightInsideMask, CV_32FC1); converToType(highLightInsideMask, CV_32FC1);
highLightInsideMask /= 255.0; highLightInsideMask /= 255.0;
Mat unifiedInsideMask = m32fInsideMaskImg.mul(highLightInsideMask).mul(mInsideWeightMat); Mat unifiedInsideMask = m32fInsideMaskImg.mul(highLightInsideMask).mul(mInsideWeightMat);
preProcessImage(rotatedInsideImg, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, preProcessImage(rotatedInsideImg, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
mTargetStddevVal, mHighlightsThreshold);
Mat vcamInside = rotatedInsideImg / 255.0; Mat vcamInside = rotatedInsideImg / 255.0;
rotatedInsideImg.setTo(0, rotatedInsideImg < 0); rotatedInsideImg.setTo(0, rotatedInsideImg < 0);
//mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0); //mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0);
@ -1240,7 +1187,8 @@ void ImageCompareModel::selfRotateMin(const Mat& img, Mat& weightMat, int repeat
{ {
Mat rotatedImg = rotateImage(img, cen, i*angleStep); Mat rotatedImg = rotateImage(img, cen, i*angleStep);
Mat dilatedImg; Mat dilatedImg;
dilate(rotatedImg, dilatedImg, Mat::ones(3, 3, CV_32FC1)); Mat kernel = Mat::ones(3, 3, CV_32FC1);
dilate(rotatedImg, dilatedImg, kernel);
dSumMat = min(dSumMat, dilatedImg); dSumMat = min(dSumMat, dilatedImg);
} }
weightMat = dSumMat; weightMat = dSumMat;
@ -1249,31 +1197,15 @@ void ImageCompareModel::selfRotateMin(const Mat& img, Mat& weightMat, int repeat
double ImageCompareModel::genMatchValue(const Mat& dMat) const double ImageCompareModel::genMatchValue(const Mat& dMat) const
{ {
double v = norm(dMat, NORM_L2); double v = norm(dMat, NORM_L2);
double ret = scaleMatchValue(v); double ret = scaleMatchValue(v);
return ret; return ret;
} }
double ImageCompareModel::genMatchValue(const Mat& rImg, const Mat& baseImg, double ImageCompareModel::genMatchValue2(const Mat& rImg, const Mat& baseImg, const Mat& maskImg) const
const Mat& maskImg, int flag, int diameter, double md_diameter, double md_height) const
{ {
Mat dMat = rImg - baseImg; Mat dMat = rImg - baseImg;
//Mat testMask = maskImg.mul(m32fMaskImg);
dMat = abs(dMat.mul(maskImg)); dMat = abs(dMat.mul(maskImg));
//dMat = abs(dMat.mul(testMask));
#ifdef DEBUG_VIEW_INTERNAL_MAT
//Mat vRImg = rImg.mul(m32fMaskImg) / 255.0;
Mat vDMat0 = abs(dMat) / 255.0;
//Mat vBase = baseImg.mul(m32fMaskImg) / 255.0;
Mat vDMat = abs(dMat) / 255.0 / 255.0;
//Mat vinsideImg = rImg.mul(m32fInsideMaskImg) / 255.0;
//Mat vinsideBase = baseImg.mul(m32fInsideMaskImg) / 255.0;
// Mat vMask = maskImg / 255.0;
//Mat vMask = testMask / 255.0;
#endif
Mat minmaxScaleMat; Mat minmaxScaleMat;
Mat mMask; Mat mMask;
if (m_parallelFlag != 1) if (m_parallelFlag != 1)
@ -1281,16 +1213,15 @@ double ImageCompareModel::genMatchValue(const Mat& rImg, const Mat& baseImg,
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uMaskImg); minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uMaskImg);
converToType(minmaxScaleMat, CV_8UC1); converToType(minmaxScaleMat, CV_8UC1);
mMask = lowerMajorityMask(minmaxScaleMat, m8uMaskImg, 0.98); mMask = lowerMajorityMask(minmaxScaleMat, m8uMaskImg, 0.98);
printLog("myLog.txt", "finish outside mMask Part"); // Mat dd = mMask / 255.0;
// Mat ddmask = m8uMaskImg / 255.0;
} }
else else
{ {
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uInsideMaskImg); minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uInsideMaskImg);
converToType(minmaxScaleMat, CV_8UC1); converToType(minmaxScaleMat, CV_8UC1);
mMask = lowerMajorityMask(minmaxScaleMat, m8uInsideMaskImg, 0.97); mMask = lowerMajorityMask(minmaxScaleMat, m8uInsideMaskImg, 0.97);
printLog("myLog.txt", "finish inside mMask Part");
} }
converToType(mMask, CV_32FC1); converToType(mMask, CV_32FC1);
mMask /= 255.0; mMask /= 255.0;
@ -1302,15 +1233,51 @@ double ImageCompareModel::genMatchValue(const Mat& rImg, const Mat& baseImg,
Mat vii = mMask.mul(maskImg); Mat vii = mMask.mul(maskImg);
Mat ii = mMask.mul(maskImg) / 255.0; Mat ii = mMask.mul(maskImg) / 255.0;
double s = sum(mMask.mul(maskImg)).val[0]; double s = sum(mMask.mul(maskImg)).val[0];
double ret = genMatchValue(dMat) / s;
return ret;
}
double ImageCompareModel::genMatchValue(const Mat& rImg, const Mat& baseImg,
const Mat& maskImg, int flag, int diameter, double md_diameter, double md_height) const
{
Mat v1 = rImg / 255.0;//展示图
Mat v2 = baseImg / 255.0;//展示图
Mat v3 = maskImg / 255.0;//展示图
Mat dMat = rImg - baseImg;
dMat = abs(dMat.mul(maskImg));
Mat dV = dMat / 255.0;
Mat minmaxScaleMat;
Mat mMask;
if (m_parallelFlag != 1)
{
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uMaskImg);
converToType(minmaxScaleMat, CV_8UC1);
mMask = lowerMajorityMask(minmaxScaleMat, m8uMaskImg, 0.98);
}
else
{
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uInsideMaskImg);
converToType(minmaxScaleMat, CV_8UC1);
mMask = lowerMajorityMask(minmaxScaleMat, m8uInsideMaskImg, 0.97);
}
converToType(mMask, CV_32FC1);
mMask /= 255.0;
dMat = dMat.mul(mMask);
Mat sunMat = mMask.mul(maskImg);
// Mat ii = mMask.mul(maskImg) / 255.0;
double s = sum(sunMat).val[0];
double ret = genMatchValue(dMat) / s; double ret = genMatchValue(dMat) / s;
if (flag == 1) if (flag == 1)
{ {
double matchedVal = ret; double matchedVal = ret;
ret = penltyCoeff(matchedVal, meanDiameter, diameter, md_diameter, md_height);//做惩罚 ret = penltyCoeff(matchedVal, meanDiameter, diameter, md_diameter, md_height);//做惩罚
printf("the matched value %f", ret);
} }
printLog("myLog.txt", "finish detect, return val");
return ret; return ret;
} }
@ -1319,7 +1286,6 @@ double ImageCompareModel::scaleMatchValue(double val) const
return val*mMatchValScale; return val*mMatchValScale;
} }
ImageCompareModel* ImageCompareModel::scale(float s) ImageCompareModel* ImageCompareModel::scale(float s)
{ {
Mat baseImage; Mat baseImage;
@ -1348,10 +1314,6 @@ ImageCompareModel* ImageCompareModel::scale(float s)
ImageCompareModel::RotateMatchResult ImageCompareModel::rotateMatch(const Mat& img, int levelNum /*= 1*/, float angleStep /*= 1.0*/, ImageCompareModel::RotateMatchResult ImageCompareModel::rotateMatch(const Mat& img, int levelNum /*= 1*/, float angleStep /*= 1.0*/,
float startAngle /*= 0*/, float endAngle /*= 360*/) const float startAngle /*= 0*/, float endAngle /*= 360*/) const
{ {
#ifdef _TEST
static int idx = 0;
std::cout << idx << " ";
#endif
RotateData* pData = new RotateData; RotateData* pData = new RotateData;
vector<Range> angleRangeVec; vector<Range> angleRangeVec;
if (levelNum > 1) if (levelNum > 1)
@ -1978,6 +1940,7 @@ void ImageCompareModel::weightReconstruction(const Mat& rImg, const Mat& baseImg
} }
} }
} }
double ImageCompareModel::penltyCoeff(double matchedVal, int diameterMean, int targetDiameter, double modelDiamter, double modelHeight) const double ImageCompareModel::penltyCoeff(double matchedVal, int diameterMean, int targetDiameter, double modelDiamter, double modelHeight) const
{ {
int diff = abs(diameterMean - targetDiameter); int diff = abs(diameterMean - targetDiameter);
@ -2173,13 +2136,7 @@ float ImageCompareModel::allocateInnerRadius(cv::Mat subImage)
initialPoint = p; initialPoint = p;
} }
} }
#ifdef _DEBUG return (minDis - 2);
Mat insideMat(tarMat.size(), tarMat.type(), Scalar::all(0));
int offset = 2;
cv::circle(insideMat, center, minDis - offset, Scalar(1), -1);
Mat ddst = insideMat.mul(subImage);
#endif
return minDis - 2;
} }
float ImageCompareModel::allocateRadius(cv::Mat subImage) float ImageCompareModel::allocateRadius(cv::Mat subImage)
@ -2331,13 +2288,13 @@ float ImageCompareModel::allocateRadius(cv::Mat subImage)
initialPoint = p; initialPoint = p;
} }
} }
#ifdef _DEBUG // #ifdef _DEBUG
Mat insideMat(tarMat.size(), tarMat.type(), Scalar::all(0)); // Mat insideMat(tarMat.size(), tarMat.type(), Scalar::all(0));
int offset = 2; // int offset = 2;
cv::circle(insideMat, center, minDis - offset, Scalar(1), -1); // cv::circle(insideMat, center, minDis - offset, Scalar(1), -1);
Mat ddst = insideMat.mul(subImage); // Mat ddst = insideMat.mul(subImage);
#endif // #endif
return minDis - 2; return (minDis - 2);
} }
void ImageCompareModel::genOutterMask() void ImageCompareModel::genOutterMask()
@ -2368,25 +2325,25 @@ void ImageCompareModel::resizeMat(Mat src, Mat &dst)
cv::resize(src, dst, cv::Size(nWidth, nWidth)); cv::resize(src, dst, cv::Size(nWidth, nWidth));
} }
void ImageCompareModel::printLog(string root, string log, double n) const // void ImageCompareModel::printLog(string root, string log, double n) const
{ // {
#ifdef DEBUG_VIEW_INTERNAL_MAT // #ifdef DEBUG_VIEW_INTERNAL_MAT
ofstream write; // ofstream write;
write.open(root, ios::app); // write.open(root, ios::app);
time_t seconds = time(NULL); // time_t seconds = time(NULL);
struct tm *p; // struct tm *p;
p = localtime(&seconds); // p = localtime(&seconds);
char strTime[100] = { 0 }; // char strTime[100] = { 0 };
sprintf(strTime, "%02d-%02d %02d:%02d:%02d:", 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec); // sprintf(strTime, "%02d-%02d %02d:%02d:%02d:", 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
std::ostringstream str; // std::ostringstream str;
str << log; // str << log;
if (n != 0) // if (n != 0)
{ // {
str << n; // str << n;
} // }
write << "time:" << string(strTime); // write << "time:" << string(strTime);
write << str.str() << "\n"; // write << str.str() << "\n";
write.close(); // write.close();
#endif // #endif
} // }

@ -1,4 +1,4 @@
/*! \file ImageCompareModel.h /*! \file ImageCompareModel.h
Copyright (C) 2014 Hangzhou Leaper. Copyright (C) 2014 Hangzhou Leaper.
@ -182,22 +182,21 @@ public:
void preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold) const; void preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold) const;
void preProcessImage(Mat& img, const Mat& mask, const Mat& weightMat, double dstMean, void preProcessImage(Mat& img, const Mat& mask, const Mat& weightMat, double dstMean,
double dstStddev, int highlightsThreshold) const; double dstStddev, int highlightsThreshold) const;
void preProcessImage0(Mat& img) const;
void weightOptimization(const vector<Mat>& falseSamples); void weightOptimization(const vector<Mat>& falseSamples);
//! 将一个图像和标准图mBaseImg进行旋转匹配再相减求得差异值 //! 将一个图像和标准图mBaseImg进行旋转匹配再相减求得差异值
/*! /*!
\param Mat img \param Mat img
\param Mat * pRImg \param Mat * pRImg
\param bool isFilterSize \param bool isFilterSize
\return double \return double
\see compare(Mat, Mat, Mat*, Mat*) \see compare(Mat, Mat, Mat*, Mat*)
*/ */
double compare(Mat srcImage, Mat* pRImg = NULL, int levelNum = 1, bool isFilterSize = true, int flag = 0, double compare(Mat srcImage, Mat* pRImg = NULL, int levelNum = 1, bool isFilterSize = true, int flag = 0,
double md_diameter = 0, double md_height = 0); double md_diameter = 0, double md_height = 0);
//! 训练得到标准图像mBaseImg //! 训练得到标准图像mBaseImg
/*! /*!
\param const vector<Mat> & imgVec \param const vector<Mat> & imgVec
\return void \return void
*/ */
void train(const vector<Mat>& vec); void train(const vector<Mat>& vec);
@ -209,26 +208,26 @@ public:
//void falseWeightmapping(Mat &img); //void falseWeightmapping(Mat &img);
double descendFunction(double pixVal, double maxVal); double descendFunction(double pixVal, double maxVal);
double penltyCoeff(double matchedVal, int diameterMean, int targetDiameterm, double modelDiamter, double modelHeight) const; double penltyCoeff(double matchedVal, int diameterMean, int targetDiameterm, double modelDiamter, double modelHeight) const;
//! 根据负样本计算差异阈值,用于判断任意一个新的图像是否属于该类别。 //! 根据负样本计算差异阈值,用于判断任意一个新的图像是否属于该类别。
/*! /*!
\param const vector<Mat> & imgVec \param const vector<Mat> & imgVec
\return void \return void
*/ */
void computeDisThre(const vector<Mat>& imgVec, double* pMinDis = NULL, double md_diameter = 0, double md_height = 0); void computeDisThre(const vector<Mat>& imgVec, double* pMinDis = NULL, double md_diameter = 0, double md_height = 0);
double filterTrainImage(const Mat &img); double filterTrainImage(const Mat &img);
//! 并行计算rotate //! 并行计算rotate
/*! /*!
\param int index index \param int index index
\param void *p \param void *p
*/ */
void parallelDetect(int index, void *p) const; void parallelDetect(int index, void *p) const;
//! 获取标准图像 //! 获取标准图像
/*! /*!
\return cv::Mat \return cv::Mat
*/ */
Mat getInsideBaseImg() const { return mInSideBaseImg; } Mat getInsideBaseImg() const { return mInSideBaseImg; }
Mat getInsideWeightImg() const { return mInsideWeightMat; } Mat getInsideWeightImg() const { return mInsideWeightMat; }
@ -263,17 +262,17 @@ public:
double getFalseSampleMinDis() const { return mFalseSampleMinDis; } double getFalseSampleMinDis() const { return mFalseSampleMinDis; }
double getMeanDiamter() const { return meanDiameter; } double getMeanDiamter() const { return meanDiameter; }
//! 获取最近一次执行readFromFile时输入的文件路径 //! 获取最近一次执行readFromFile时输入的文件路径
/*! /*!
\return string \return string
*/ */
string getFilePath() const { return mFilePath; } string getFilePath() const { return mFilePath; }
double getDisThre() const { return mDisThre; } double getDisThre() const { return mDisThre; }
void setDisThre(double val) { mDisThre = val; } void setDisThre(double val) { mDisThre = val; }
//! 启用缓存。缓存会将每次调用compare接口输入的img参数的data指针作为key存储 //! 启用缓存。缓存会将每次调用compare接口输入的img参数的data指针作为key存储
// 差异值。 // 差异值。
/*! /*!
\return void \return void
*/ */
@ -303,16 +302,16 @@ public:
void setRealHeight(int val){ realHeight = val; } void setRealHeight(int val){ realHeight = val; }
int getRealWidth(){ return realWidth; } int getRealWidth(){ return realWidth; }
int getRealHeight(){ return realHeight; } int getRealHeight(){ return realHeight; }
void printLog(string root, string log, double n = 0) const; //void printLog(string root, string log, double n = 0) const;
protected: protected:
//! 尚未完成将两个图像分别和标准图mBaseImg进行旋转匹配再相减求得差异值 //! 尚未完成将两个图像分别和标准图mBaseImg进行旋转匹配再相减求得差异值
/*! /*!
\param Mat img0 img0 \param Mat img0 img0
\param Mat img1 img1 \param Mat img1 img1
\param Mat * pRImg0 img0mBaseImgrimg0 \param Mat * pRImg0 img0mBaseImgrimg0
\param Mat * pRImg1 img1mBaseImgrimg1 \param Mat * pRImg1 img1mBaseImgrimg1
\return double mMatchValScale*norm(rimg0 - rimg1)/(cols*rows) \return double mMatchValScale*norm(rimg0 - rimg1)/(cols*rows)
*/ */
double compare(Mat img0, Mat img1, Mat* pRImg0 = NULL, Mat* pRImg1 = NULL); double compare(Mat img0, Mat img1, Mat* pRImg0 = NULL, Mat* pRImg1 = NULL);
@ -320,6 +319,7 @@ protected:
double genMatchValue(const Mat& rImg, const Mat& baseImg, const Mat& maskImg, int flag, int diameter, double md_diameter, double md_height) const; double genMatchValue(const Mat& rImg, const Mat& baseImg, const Mat& maskImg, int flag, int diameter, double md_diameter, double md_height) const;
double genMatchValue(const Mat& dMat) const; double genMatchValue(const Mat& dMat) const;
double genMatchValue2(const Mat& rImg, const Mat& baseImg, const Mat& maskImg) const;
double scaleMatchValue(double val) const; double scaleMatchValue(double val) const;
void weightReconstruction(const Mat& rImg, const Mat& baseImg, const Mat& maskImg, Mat &reConImg); void weightReconstruction(const Mat& rImg, const Mat& baseImg, const Mat& maskImg, Mat &reConImg);
void preWeightReconstruction(Mat img, Mat &reConImg); void preWeightReconstruction(Mat img, Mat &reConImg);

@ -310,7 +310,7 @@ int CAlgorithmCompare::IImageAnalysis(class IImageObject* pImgObj)
if (matMatch.empty()) if (matMatch.empty())
{ {
rltMap.insert("noCircle", 0); rltMap.insert("noCircle", 0);
QImage srcImg = QtCVUtils::cvMatToQImage(matSrc); QImage srcImg = cvMat2QImage(matSrc);
rltMap.insert("srcImage", srcImg); rltMap.insert("srcImage", srcImg);
pImgObj->IVariantMapToUI(rltMap); pImgObj->IVariantMapToUI(rltMap);
return 0; return 0;
@ -330,12 +330,7 @@ int CAlgorithmCompare::IImageAnalysis(class IImageObject* pImgObj)
if (!matMatch.empty() && ptr && ptr->size() > 0) { if (!matMatch.empty() && ptr && ptr->size() > 0) {
vector<double> minDisVec(ptr->size()); vector<double> minDisVec(ptr->size());
qDebug() << "start bestMatch";
QString str = bestMatch(ptr, &wheelLocal, &(minDisVec[0]), minDisVec.size()); QString str = bestMatch(ptr, &wheelLocal, &(minDisVec[0]), minDisVec.size());
qDebug() << "end bestMatch";
// pResult->m_strModel = str;
// pResult->m_dMinDis = minDisVec[0];
mResult.insert("modeName", str); mResult.insert("modeName", str);
mResult.insert("minDis", minDisVec[0]); mResult.insert("minDis", minDisVec[0]);
@ -343,7 +338,6 @@ int CAlgorithmCompare::IImageAnalysis(class IImageObject* pImgObj)
ICompareModel *pModel = ptr->value(str)->getImageComModel(); ICompareModel *pModel = ptr->value(str)->getImageComModel();
double d = pModel->getDisThre(); double d = pModel->getDisThre();
double dValue = (d - minDisVec[0]) / d * 0.4 + 0.6; double dValue = (d - minDisVec[0]) / d * 0.4 + 0.6;
//pResult->m_dScore = dValue;
mResult.insert("score", dValue); mResult.insert("score", dValue);
} }
} }
@ -354,17 +348,8 @@ int CAlgorithmCompare::IImageAnalysis(class IImageObject* pImgObj)
mResult.insert("diameter", dDiameter); mResult.insert("diameter", dDiameter);
mResult.insert("thickness", th); mResult.insert("thickness", th);
//pResult->m_pixSrc = QtCVUtils::cvMatToQPixmap(matSrc);//!>原图像发送值UI 用于保存备份和调试
//QImage img = QtCVUtils::cvMatToQImage(matMatch);
//pResult->m_pixResult = QtCVUtils::cvMatToQPixmap(matMatch);
//pResult->m_dDiameter = dDiameter;
//pResult->m_dThickness = th;
double dTime = (cv::getTickCount() - dStart) / cv::getTickFrequency(); double dTime = (cv::getTickCount() - dStart) / cv::getTickFrequency();
//pResult->m_dRunTime = dTime;
mResult.insert("runTime", dTime); mResult.insert("runTime", dTime);
//long long varRlt = (long long)pResult;
rltMap.insert("result", mResult); rltMap.insert("result", mResult);
QImage srcImg = cvMat2QImage(matSrc); QImage srcImg = cvMat2QImage(matSrc);
rltMap.insert("srcImage", srcImg); rltMap.insert("srcImage", srcImg);

@ -30,6 +30,7 @@ Mat _EnhanImg_sharpen(const Mat &img) {
Mat openMat = orResult.clone(); Mat openMat = orResult.clone();
return openMat; return openMat;
} }
Mat findEdge2(const Mat &Src) Mat findEdge2(const Mat &Src)
{ {
Mat ret = Src.clone(); Mat ret = Src.clone();
@ -42,6 +43,7 @@ Mat findEdge2(const Mat &Src)
filter2D(Src, ret, CV_8UC1, kernel); filter2D(Src, ret, CV_8UC1, kernel);
return ret; return ret;
} }
#define REAIZE 2 #define REAIZE 2
cv::Mat ImageProcess::findCircleObject(const Mat &srcImg, const Mat& backgroundImg, bool useBackgroundFlag, int nThres /*= 20*/, luffy_base::luffyCircle *pCircle /*= NULL*/) cv::Mat ImageProcess::findCircleObject(const Mat &srcImg, const Mat& backgroundImg, bool useBackgroundFlag, int nThres /*= 20*/, luffy_base::luffyCircle *pCircle /*= NULL*/)
{ {
@ -50,7 +52,7 @@ cv::Mat ImageProcess::findCircleObject(const Mat &srcImg, const Mat& backgroundI
if (!useBackgroundFlag) if (!useBackgroundFlag)
{ {
Mat detectImg; Mat detectImg;
Mat src = srcImg;// (Rect(435, 53, 1721, 1824)); Mat src = srcImg(Rect(435, 53, 1721, 1824));
cv::resize(src, detectImg, cv::Size(src.cols / REAIZE, src.rows / REAIZE)); cv::resize(src, detectImg, cv::Size(src.cols / REAIZE, src.rows / REAIZE));
int bBaseX = detectImg.cols; int bBaseX = detectImg.cols;
int bBaseY = detectImg.rows; int bBaseY = detectImg.rows;
@ -84,7 +86,7 @@ cv::Mat ImageProcess::findCircleObject(const Mat &srcImg, const Mat& backgroundI
if (startX > 0 && startY > 0 && hight > 0 \ if (startX > 0 && startY > 0 && hight > 0 \
&& startX < src.cols &&startY < src.rows \ && startX < src.cols &&startY < src.rows \
&&hight < src.cols&&hight < src.rows \ && hight < src.cols&&hight < src.rows \
&& (startX + hight) < src.cols && (startY + hight) < src.rows) && (startX + hight) < src.cols && (startY + hight) < src.rows)
{ {
Mat cutMat = src(Rect(startX, startY, hight, hight)); Mat cutMat = src(Rect(startX, startY, hight, hight));
@ -123,10 +125,6 @@ cv::Mat ImageProcess::findCircleObject(const Mat &srcImg, const Mat& backgroundI
assert(backgroundImg.type() == CV_8UC1); assert(backgroundImg.type() == CV_8UC1);
Mat imgTmp = src, imgBinary; Mat imgTmp = src, imgBinary;
// const cv::Size cSize = cv::Size(ALG_RESIZE_IMAGE_WIDTH, floorf(ALG_RESIZE_IMAGE_WIDTH / (float)src.cols*(float)src.rows));
// cv::resize(src, imgTmp, cSize);
//Mat foregroundImg = getForeImage(imgTmp, backgroundImg);// 0421
using namespace luffy_base; using namespace luffy_base;
luffy_threshold::Threshold(imgTmp, imgBinary, 50);//0421 luffy_threshold::Threshold(imgTmp, imgBinary, 50);//0421
@ -175,13 +173,6 @@ cv::Mat ImageProcess::findCircleObject(const Mat &srcImg, const Mat& backgroundI
imgTmp(rt).copyTo(dst); imgTmp(rt).copyTo(dst);
static int nCount = cv::getTickCount(); static int nCount = cv::getTickCount();
if (pCircle) { if (pCircle) {
/*float fScale = src.cols / ALG_RESIZE_IMAGE_WIDTH;
Mat matBig = src - backgroundImg;
pCircle->fRadius = fRadius * fScale;
pCircle->ptCenter = Point(ptCenter.x * fScale, ptCenter.y * fScale);
Rect rt(pCircle->ptCenter.x - pCircle->fRadius + nOffset, pCircle->ptCenter.y - pCircle->fRadius + nOffset, 2 * pCircle->fRadius, 2 * pCircle->fRadius);
rt &= Rect(0, 0, matBig.cols, matBig.rows);
src(rt).copyTo(dst);*/
float fScale = src.cols / ALG_RESIZE_IMAGE_WIDTH; float fScale = src.cols / ALG_RESIZE_IMAGE_WIDTH;
Mat matBig = src - backgroundImg; Mat matBig = src - backgroundImg;
pCircle->fRadius = fRadius * fScale; pCircle->fRadius = fRadius * fScale;

@ -257,6 +257,9 @@ void CCameraHik::ISnapCamera()
if (MV_OK != nRet){ if (MV_OK != nRet){
qWarning() << QString("Error: TriggerSource to line0 failed [%1]").arg(nRet) qWarning() << QString("Error: TriggerSource to line0 failed [%1]").arg(nRet)
<< " - " << __FUNCTION__; << " - " << __FUNCTION__;
ICloseCamera();
IOpenCamera();
IStartCamera();
return ; return ;
} }
nValue = MV_TRIGGER_MODE_ON; nValue = MV_TRIGGER_MODE_ON;

@ -88,6 +88,7 @@ void lpImgViewer::wheelEvent(QWheelEvent *evt)
mpImgItem->setTransformOriginPoint(0, 0); mpImgItem->setTransformOriginPoint(0, 0);
scaleImg2(newScale); scaleImg2(newScale);
emit sgImageScale(newScale);
} }
else else
{ {
@ -218,7 +219,7 @@ void lpImgViewer::scaleImg(QTransform tf, QPointF center)
void lpImgViewer::scaleImg2(qreal scale) void lpImgViewer::scaleImg2(qreal scale)
{ {
if (scale < 0.1) if (scale < 0.01)
return; return;
m_scale = scale; m_scale = scale;
QTransform t; QTransform t;

@ -56,7 +56,7 @@ signals:
void imgMoved(QPointF pos); void imgMoved(QPointF pos);
void pixelSelected(QPoint pos); void pixelSelected(QPoint pos);
void imgScaledWithFixedSize(qreal scale); void imgScaledWithFixedSize(qreal scale);
void sgImageScale(qreal);
public slots: public slots:
void scaleImg(QTransform tf, QPointF center); void scaleImg(QTransform tf, QPointF center);
void moveImg(QPointF pos); void moveImg(QPointF pos);

@ -12,6 +12,7 @@
#define WHEEL_D2H_K "k" #define WHEEL_D2H_K "k"
#define WHEEL_D2H_B "b" #define WHEEL_D2H_B "b"
#pragma execution_character_set("utf-8")
lpGlobalConfig::lpGlobalConfig() lpGlobalConfig::lpGlobalConfig()
: IsOnline(0), IsDetect(0), IsCheck(false) : IsOnline(0), IsDetect(0), IsCheck(false)
@ -36,6 +37,11 @@ void lpGlobalConfig::init(QString strPath)
QString fileMyself = m_applicationDirPath + WHEEL_SELFDEFINE_FILE; QString fileMyself = m_applicationDirPath + WHEEL_SELFDEFINE_FILE;
QJsonObject jsMyself = QZkJsonParser::ReadJsonAuto(fileMyself); QJsonObject jsMyself = QZkJsonParser::ReadJsonAuto(fileMyself);
tcpServerPort = jsMyself.value("tcpServerPort").toInt(10100); tcpServerPort = jsMyself.value("tcpServerPort").toInt(10100);
webSocketPort = jsMyself.value("webSocketPort").toInt(10110);
bRunBackRunning = jsMyself.value("runBackRnning").toBool(false);
bRunBackClosing = jsMyself.value("runBackClosing").toBool(false);//关闭页面时自动后台运行
strSysTitle = jsMyself.value("systitle").toString(QObject::tr("识别定位一体系统"));//系统标题
QJsonObject algObj = jsMyself.value(WHEEL_SELFDEFINE_ALGPARA).toObject(); QJsonObject algObj = jsMyself.value(WHEEL_SELFDEFINE_ALGPARA).toObject();
if (!algObj.isEmpty()) if (!algObj.isEmpty())
@ -280,6 +286,11 @@ void lpGlobalConfig::saveDeteImage()
jsMyself.insert(WHEEL_SELFDEFINE_AUTOITEM, autosystemobj); jsMyself.insert(WHEEL_SELFDEFINE_AUTOITEM, autosystemobj);
jsMyself.insert("tcpServerPort", tcpServerPort); jsMyself.insert("tcpServerPort", tcpServerPort);
jsMyself.insert("webSocketPort", webSocketPort);
jsMyself.insert("runBackRnning",bRunBackRunning);
jsMyself.insert("runBackClosing", bRunBackClosing);//关闭页面时自动后台运行
jsMyself.insert("systitle", strSysTitle);//系统标题
QZkJsonParser::WriteJsonObject(fileMyself, jsMyself); QZkJsonParser::WriteJsonObject(fileMyself, jsMyself);
} }

@ -87,7 +87,7 @@ public:
bool bSaveSrcNGImg_value{ false };//是否保存定位NG原始图像 bool bSaveSrcNGImg_value{ false };//是否保存定位NG原始图像
bool bSaveSrcOKImg_value{ false };//是否保存定位NG原始图像 bool bSaveSrcOKImg_value{ false };//是否保存定位NG原始图像
int tcpServerPort{ 10100 }; int tcpServerPort{ 10100 };
int webSocketPort{ 10110 };
//坐标标定 //坐标标定
QPoint point1;//标定点 1 QPoint point1;//标定点 1
@ -97,6 +97,10 @@ public:
double pointXOffset{ 0 };//物理标点横向偏移 double pointXOffset{ 0 };//物理标点横向偏移
double pointYOffset{ 0 };//物理标点纵向偏移 double pointYOffset{ 0 };//物理标点纵向偏移
int pointCircle{ 20 };//标定点 直径 int pointCircle{ 20 };//标定点 直径
bool bRunBackRunning{ true };//启动是自动后台运行
bool bRunBackClosing{ false };//关闭页面时自动后台运行
QString strSysTitle;//系统标题
}; };
#endif #endif

@ -53,8 +53,8 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;QT_NETWORKAUTH_LIB;QT_WEBSOCKETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtNetworkAuth;$(QTDIR)\include\QtWebSockets;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@ -65,13 +65,13 @@
<OutputFile>$(SolutionDir)..\runner17\$(TargetName)$(TargetExt)</OutputFile> <OutputFile>$(SolutionDir)..\runner17\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;Qt5Locationd.lib;Qt5Networkd.lib;Qt5NetworkAuthd.lib;Qt5WebSocketsd.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<QtMoc> <QtMoc>
<OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile> <OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile>
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
<IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</IncludePath> <IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtNetworkAuth;$(QTDIR)\include\QtWebSockets;%(AdditionalIncludeDirectories)</IncludePath>
<Define>UNICODE;_UNICODE;WIN32;WIN64;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</Define> <Define>UNICODE;_UNICODE;WIN32;WIN64;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;QT_NETWORKAUTH_LIB;QT_WEBSOCKETS_LIB;%(PreprocessorDefinitions)</Define>
</QtMoc> </QtMoc>
<QtUic> <QtUic>
<ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription>
@ -85,8 +85,8 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;QT_NETWORKAUTH_LIB;QT_WEBSOCKETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtNetworkAuth;$(QTDIR)\include\QtWebSockets;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat /> <DebugInformationFormat />
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@ -96,13 +96,13 @@
<OutputFile>$(SolutionDir)..\runner17\$(TargetName)$(TargetExt)</OutputFile> <OutputFile>$(SolutionDir)..\runner17\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>false</GenerateDebugInformation> <GenerateDebugInformation>false</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;Qt5Location.lib;Qt5Network.lib;Qt5NetworkAuth.lib;Qt5WebSockets.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<QtMoc> <QtMoc>
<OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile> <OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile>
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
<IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</IncludePath> <IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtNetworkAuth;$(QTDIR)\include\QtWebSockets;%(AdditionalIncludeDirectories)</IncludePath>
<Define>UNICODE;_UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</Define> <Define>UNICODE;_UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;QT_NETWORKAUTH_LIB;QT_WEBSOCKETS_LIB;%(PreprocessorDefinitions)</Define>
</QtMoc> </QtMoc>
<QtUic> <QtUic>
<ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription>
@ -115,6 +115,7 @@
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="QSignleApplication.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtRcc Include="Enchanter.qrc" /> <QtRcc Include="Enchanter.qrc" />
@ -126,6 +127,10 @@
</QtMoc> </QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="QSignleApplication.h">
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets</IncludePath>
</QtMoc>
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -33,11 +33,17 @@
<ClCompile Include="main.cpp"> <ClCompile Include="main.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="QSignleApplication.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="IMainWidget.h"> <QtMoc Include="IMainWidget.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="QSignleApplication.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtRcc Include="Enchanter.qrc"> <QtRcc Include="Enchanter.qrc">

@ -0,0 +1,105 @@
#include "QSignleApplication.h"
#include <QMainWindow>
#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
#include <QFileInfo>
#include <QMessageBox>
#pragma execution_character_set("utf-8")
SingleApplication::SingleApplication(int &args, char **argv, QString strServerName) :
QApplication(args, argv),
instanceRunning(false),
localServer(NULL),
mainWindow(NULL)
{
/**
* localServer
*
*
*/
// serverName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();
//m_serverName = strServerName;
m_serverName = applicationName();
initLocalConnection();
}
void SingleApplication::initLocalConnection()
{
instanceRunning = false;
QLocalSocket socket;
//将套接字连接至进程服务,参数即为进程服务名
socket.connectToServer(m_serverName);
//若在500ms内连接至进程服务说明进程服务已运行
if (socket.waitForConnected(500)) {
instanceRunning = true;
// 其他处理,如:将启动参数发送到进程服务端
QTextStream stream(&socket);
QStringList args = QCoreApplication::arguments();
if (args.count() > 1)
stream << args.last();
else
stream << QString();
stream.flush();
socket.waitForBytesWritten();
return;
}
newLocalServer();//连接不上进程服务器,就创建一个
}
////////////////////////////////////////////////////////////////////////////////
// 说明:
// 创建LocalServer
////////////////////////////////////////////////////////////////////////////////
void SingleApplication::newLocalServer()
{
localServer = new QLocalServer(this);
connect(localServer, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));
if (!localServer->listen(m_serverName)) {
// 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除之
if (localServer->serverError() == QAbstractSocket::AddressInUseError) {
QLocalServer::removeServer(m_serverName); //移除进程服务
localServer->listen(m_serverName); //再次监听
}
}
}
void SingleApplication::newLocalConnection()
{
//监听进程服务,当有数据进来时,可以通过 nextPendingConnection() 获取套接字
QLocalSocket *socket = localServer->nextPendingConnection();
if (!socket)
return;
socket->waitForReadyRead(1000);
//其他处理
QTextStream stream(socket);
delete socket;
if (mainWindow != NULL) {
//当主窗口对象不为空时,说明有可能主窗口被隐藏了,所以需要将其展示在桌面,同时给予用户提示
mainWindow->raise();
mainWindow->activateWindow();
mainWindow->setWindowState((mainWindow->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
mainWindow->show();
//QMessageBox::warning(NULL, "警告", "程序已经启动!");
}
}
////////////////////////////////////////////////////////////////////////////////
// 说明:
// 检查是否已有一个实例在运行, true - 有实例运行, false - 没有实例运行
////////////////////////////////////////////////////////////////////////////////
bool SingleApplication::getInstanceRunning() const
{
return instanceRunning;
}
QMainWindow *SingleApplication::getMainWindow() const
{
return mainWindow;
}
void SingleApplication::setMainWindow(QMainWindow *value)
{
mainWindow = value;
}

@ -0,0 +1,46 @@
#ifndef _H_QSIGNLEAPPLICATION_H_
#define _H_QSIGNLEAPPLICATION_H_
#include <QObject>
#include <QApplication>
class QMainWindow;
class QLocalServer;
class SingleApplication : public QApplication
{
Q_OBJECT
public:
SingleApplication(int &args, char **argv, QString strServerName);
bool getInstanceRunning() const; // 是否已经有实例在运行
QMainWindow *getMainWindow() const;
void setMainWindow(QMainWindow *value);
private slots:
void newLocalConnection();
private:
void initLocalConnection(); // 初始化本地连接
void newLocalServer(); // 创建服务端
bool instanceRunning{ false }; // 是否已经有实例在运行
QLocalServer *localServer{ nullptr }; // 本地socket Server用于本地进程间通信
QString m_serverName; // 服务名称
QMainWindow *mainWindow{ nullptr }; // MainWindow指针
};
/*
Example:
int main(int argc, char *argv[]){
SingleApplication a(argc, argv, "lp_report");
if (!a.getInstanceRunning())
{
slpsf_mark_report w;
a.setMainWindow(&w);
w.show();
return a.exec();
}
return 0;
}
*/
#endif

@ -2,14 +2,18 @@
#include <QMessageBox> #include <QMessageBox>
#include "IMainWidget.h" #include "IMainWidget.h"
#include <QLibrary> #include <QLibrary>
#include "QSignleApplication.h"
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication a(argc, argv);
IMainWidget* pMain = nullptr; IMainWidget* pMain = nullptr;
QWidget* pMainWid = nullptr; QWidget* pMainWid = nullptr;
SingleApplication a(argc, argv, "mainApp");
if (!a.getInstanceRunning()) {
#ifdef _DEBUG #ifdef _DEBUG
QLibrary lib("lpMaind"); QLibrary lib("lpMaind");
#else #else
@ -30,11 +34,14 @@ int main(int argc, char *argv[])
else { else {
QMessageBox::information(0, "", QObject::tr("lpMain¼ÓÔØÊ§°Ü")); QMessageBox::information(0, "", QObject::tr("lpMain¼ÓÔØÊ§°Ü"));
} }
if (pMain) { if (pMain) {
delete pMain; delete pMain;
pMain = nullptr; pMain = nullptr;
} }
if (lib.isLoaded()) if (lib.isLoaded())
lib.unload(); lib.unload();
}
return 0; return 0;
} }

@ -75,10 +75,10 @@
<ClCompile> <ClCompile>
<PreprocessorDefinitions>UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;TPALGORITHMQT_LIB;%(PreprocessorDefinitions);ALGORITHM_EXPORTS;QT_GUI_LIB</PreprocessorDefinitions> <PreprocessorDefinitions>UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;TPALGORITHMQT_LIB;%(PreprocessorDefinitions);ALGORITHM_EXPORTS;QT_GUI_LIB</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;..\..\3part\tadpole\include\tpBase;..\..\3part\opencv3.4.1\include;..\..\3part\opencv3.4.1\include\opencv;..\..\3part\opencv3.4.1\include\opencv2;..\..\3part\libzkq\include;..\..\3part\libzkq\include\syswin;..\..\3part\Cyclops\include;..\..\3part\edcircle\include;..\..\src\interface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;..\..\3part\tadpole\include\tpBase;..\..\3part\opencv3.4.1\include;..\..\3part\opencv3.4.1\include\opencv;..\..\3part\opencv3.4.1\include\opencv2;..\..\3part\libzkq\include;..\..\3part\libzkq\include\syswin;..\..\3part\Cyclops\include;..\..\3part\edcircle\include;..\..\src\interface;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<Optimization>Disabled</Optimization>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

@ -207,6 +207,8 @@ lpMainWin::lpMainWin(QWidget *parent)
ui.tp_main_tabWidget->setCurrentIndex(0); ui.tp_main_tabWidget->setCurrentIndex(0);
m_pImageCaliUI = new lpImageCaliUI(); m_pImageCaliUI = new lpImageCaliUI();
connect(m_pSystemConfigUI, SIGNAL(sgUpdateInfo()), this, SLOT(setWindowTitleInfo()));
} }
onSetModel(); onSetModel();
{ {
@ -250,9 +252,12 @@ lpMainWin::lpMainWin(QWidget *parent)
//connect(m_pServer, SIGNAL(sgConnected(bool)), this, SLOT(onConnected(bool))); //connect(m_pServer, SIGNAL(sgConnected(bool)), this, SLOT(onConnected(bool)));
//connect(m_pServer, SIGNAL(sgClientInfo(QString, int, bool)), this, SLOT(onClientInfo(QString, int, bool))); //connect(m_pServer, SIGNAL(sgClientInfo(QString, int, bool)), this, SLOT(onClientInfo(QString, int, bool)));
int port = lpGlobalConfig::instance()->webSocketPort;
RecvFunc func = std::bind(&lpMainWin::onWebSocketRecvData, this, std::placeholders::_1, std::placeholders::_2); RecvFunc func = std::bind(&lpMainWin::onWebSocketRecvData, this, std::placeholders::_1, std::placeholders::_2);
m_pWebSocket->openServer(10110, func); m_pWebSocket->openServer(port, func);
} }
setWindowTitleInfo();
} }
lpMainWin::~lpMainWin() lpMainWin::~lpMainWin()
@ -550,6 +555,7 @@ void lpMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap)
(2) (2)
*/ */
pResult->m_pixSrc = QPixmap::fromImage(srcImg);
if (!pResult->m_strModel.isEmpty()) if (!pResult->m_strModel.isEmpty())
{ {
ui.main_value_Result->setText("定位中"); ui.main_value_Result->setText("定位中");
@ -568,6 +574,9 @@ void lpMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap)
valueRlt.angle = 361; valueRlt.angle = 361;
valueRlt.strModel = "NG"; valueRlt.strModel = "NG";
valueRlt.score = 0; valueRlt.score = 0;
int h = srcImg.height();
int w = srcImg.width();
uchar* p = srcImg.bits();
if(!srcImg.isNull()) if(!srcImg.isNull())
valueRlt.pixmap = QPixmap::fromImage(srcImg); valueRlt.pixmap = QPixmap::fromImage(srcImg);
valueRlt.strRunState = "no task"; valueRlt.strRunState = "no task";
@ -816,14 +825,13 @@ void lpMainWin::IEngineResult(QVariantMap vMap)
void lpMainWin::showWidget() void lpMainWin::showWidget()
{ {
if (m_showMode == 1) if (lpGlobalConfig::instance()->bRunBackRunning == false)
{ {
setMainWindowVisibility(true); setMainWindowVisibility(true);
} }
else { else {
setMainWindowVisibility(false); setMainWindowVisibility(false);
} }
} }
Q_SLOT void lpMainWin::onLogInOut(QString strName, int level, int state) Q_SLOT void lpMainWin::onLogInOut(QString strName, int level, int state)
@ -1081,11 +1089,14 @@ void lpMainWin::timerEvent(QTimerEvent *event)
void lpMainWin::closeEvent(QCloseEvent *event) void lpMainWin::closeEvent(QCloseEvent *event)
{ {
if (lpGlobalConfig::instance()->bRunBackClosing == true)
{
if (m_bExit == false) if (m_bExit == false)
{ {
setMainWindowVisibility(false); setMainWindowVisibility(false);
return event->ignore(); return event->ignore();
} }
}
return event->accept(); return event->accept();
} }
@ -1275,26 +1286,26 @@ Q_SLOT void lpMainWin::onTriggerCam()
void lpMainWin::onInitAbout() void lpMainWin::onInitAbout()
{ {
QString aboutString; // QString aboutString;
aboutString = QString( // aboutString = QString(
"<h1>%1</h1>" // "<h1>%1</h1>"
"<p>%2.</p>" // "<p>%2.</p>"
"<p>%3:www.hzleaper.com</p>" // "<p>%3:www.hzleaper.com</p>"
"<p>%4:%5</p>" // "<p>%4:%5</p>"
"<p>%6:%7</p>" // "<p>%6:%7</p>"
"<p>%8%9</p>" // "<p>%8%9</p>"
"<p> </p>" // "<p> </p>"
).arg(tr("轮毂型号识别系统")) // ).arg(tr("轮毂型号识别系统"))
.arg(tr("本软件由杭州利珀科技开发,用于轮毂型号识别和分类,可搭配流水线运输系统使用")) // .arg(tr("本软件由杭州利珀科技开发,用于轮毂型号识别和分类,可搭配流水线运输系统使用"))
.arg(tr("若需要进一步了解该产品的相关信息,请访问我们的网站")) // .arg(tr("若需要进一步了解该产品的相关信息,请访问我们的网站"))
.arg(tr("软件版本")).arg(VERSION_HUB) // .arg(tr("软件版本")).arg(VERSION_HUB)
.arg(tr("算法版本")).arg(VERSION_ALG) // .arg(tr("算法版本")).arg(VERSION_ALG)
.arg(tr("最后更新时间")).arg(UPDATE_TIME) // .arg(tr("最后更新时间")).arg(UPDATE_TIME)
.arg(tr("版权 (c) 属 杭州利珀科技有限公司 所有")); // .arg(tr("版权 (c) 属 杭州利珀科技有限公司 所有"));
m_aboutDlg.setFixedSize(500, 300); m_aboutDlg.setFixedSize(500, 300);
QTextEdit* pEdit = new QTextEdit(&m_aboutDlg); QTextEdit* pEdit = new QTextEdit(&m_aboutDlg);
pEdit->setReadOnly(true); pEdit->setReadOnly(true);
pEdit->append(aboutString); pEdit->append("11");
pEdit->setAttribute(Qt::WA_TranslucentBackground, true); pEdit->setAttribute(Qt::WA_TranslucentBackground, true);
QPalette pl = pEdit->palette(); QPalette pl = pEdit->palette();
pl.setBrush(QPalette::Base, QBrush(QColor(255, 0, 0, 0))); pl.setBrush(QPalette::Base, QBrush(QColor(255, 0, 0, 0)));
@ -1473,6 +1484,13 @@ bool lpMainWin::readExposureTimeConfig(const QString& strPath)
if (jsonObj.empty()) if (jsonObj.empty())
{ {
qDebug() << "Json file parsing failed!"; qDebug() << "Json file parsing failed!";
QJsonObject rootObj;
QJsonArray exposttime;
exposttime.append("1000");
rootObj.insert("exposureTime", exposttime);
rootObj.insert("switch", 0);
QZkJsonParser::WriteJsonObject(filePath, rootObj);
return false; return false;
} }
@ -1517,7 +1535,7 @@ Result2Ui *lpMainWin::parseMap(const QVariantMap &vMap)
pRes->m_dScore = vMap.value("score").toDouble(); pRes->m_dScore = vMap.value("score").toDouble();
pRes->m_dDiameter = vMap.value("diameter").toDouble(); pRes->m_dDiameter = vMap.value("diameter").toDouble();
pRes->m_dThickness = vMap.value("thickness").toDouble(); pRes->m_dThickness = vMap.value("thickness").toDouble();
pRes->m_pixSrc = QPixmap::fromImage(vMap.value("pixSrc").value<QImage>());
pRes->m_pixResult = QPixmap::fromImage(vMap.value("pixResult").value<QImage>()); pRes->m_pixResult = QPixmap::fromImage(vMap.value("pixResult").value<QImage>());
pRes->m_dRunTime = vMap.value("runTime").toDouble(); pRes->m_dRunTime = vMap.value("runTime").toDouble();
return pRes; return pRes;
@ -1671,6 +1689,14 @@ Q_SLOT void lpMainWin::onWebSocketRecvData(QWebSocket* p, QByteArray data)
{ {
this->show(); this->show();
} }
else if (strcmd == "hideWidget")
{
}
else if (strcmd == "exitApp")
{
onQuitApplication();
}
} }
} }
@ -1758,7 +1784,8 @@ Q_SLOT void lpMainWin::onActivated(QSystemTrayIcon::ActivationReason reason)
void lpMainWin::setMainWindowVisibility(bool state) void lpMainWin::setMainWindowVisibility(bool state)
{ {
if (state) { if (state) {
show(); //show();
showMaximized();
qApp->processEvents(); qApp->processEvents();
qApp->setActiveWindow(this); qApp->setActiveWindow(this);
qApp->processEvents(); qApp->processEvents();
@ -1775,3 +1802,14 @@ Q_SLOT void lpMainWin::onQuitApplication()
m_bExit = true; m_bExit = true;
lpMainWin::close(); lpMainWin::close();
} }
Q_SLOT void lpMainWin::setWindowTitleInfo()
{
setWindowTitle(lpGlobalConfig::instance()->strSysTitle);
ui.m_winTitle->setText(lpGlobalConfig::instance()->strSysTitle);
if (m_trayIcon)
{
m_trayIcon->setToolTip(lpGlobalConfig::instance()->strSysTitle);
}
}

@ -116,13 +116,13 @@ protected:
void sendWebAlgRlt(const ValueResult& rlt); void sendWebAlgRlt(const ValueResult& rlt);
QJsonObject byte2Json(QByteArray data); QJsonObject byte2Json(QByteArray data);
QByteArray Json2byte(QJsonObject obj); QByteArray Json2byte(QJsonObject obj);
Q_SLOT void setWindowTitleInfo();
private://trayIcon
void setupTrayIcon(); void setupTrayIcon();
Q_SLOT void onActivated(QSystemTrayIcon::ActivationReason reason); Q_SLOT void onActivated(QSystemTrayIcon::ActivationReason reason);
void setMainWindowVisibility(bool state); void setMainWindowVisibility(bool state);
Q_SLOT void onQuitApplication(); Q_SLOT void onQuitApplication();
private: private:
void onShowResult(Result2Ui* pRlt);//展示识别结果 void onShowResult(Result2Ui* pRlt);//展示识别结果
void saveValveImage(QImage image, QString strName = "NG"); void saveValveImage(QImage image, QString strName = "NG");

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1026</width> <width>1026</width>
<height>675</height> <height>704</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -107,7 +107,7 @@
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<item row="0" column="0"> <item row="1" column="0">
<widget class="QSplitter" name="splitter_2"> <widget class="QSplitter" name="splitter_2">
<property name="autoFillBackground"> <property name="autoFillBackground">
<bool>true</bool> <bool>true</bool>
@ -219,6 +219,18 @@
</layout> </layout>
</widget> </widget>
</widget> </widget>
<widget class="QLabel" name="m_winTitle">
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>识别定位检测</string>
</property>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -772,8 +784,6 @@ font: 75 24pt &quot;Consolas&quot;;</string>
<attribute name="toolBarBreak"> <attribute name="toolBarBreak">
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<addaction name="action_Login"/>
<addaction name="action_userManager"/>
<addaction name="action_modelmgr"/> <addaction name="action_modelmgr"/>
<addaction name="action_designer"/> <addaction name="action_designer"/>
<addaction name="action_connect_mode"/> <addaction name="action_connect_mode"/>

@ -36,11 +36,19 @@ Q_SLOT void lpSystemConfigUI::onButtonClicked()
lpGlobalConfig::instance()->bSaveSrcNGImg_value = ui.checkBox_saveValue_NGSrcImg->isChecked();//¶¨Î» lpGlobalConfig::instance()->bSaveSrcNGImg_value = ui.checkBox_saveValue_NGSrcImg->isChecked();//¶¨Î»
lpGlobalConfig::instance()->m_SaveImgDirPath = ui.lineEdit->text(); lpGlobalConfig::instance()->m_SaveImgDirPath = ui.lineEdit->text();
lpGlobalConfig::instance()->tcpServerPort = ui.lineEdit_2->text().toInt(); lpGlobalConfig::instance()->tcpServerPort = ui.lineEdit_2->text().toInt();
lpGlobalConfig::instance()->webSocketPort = ui.lineEdit_3->text().toInt();
lpGlobalConfig::instance()->bRunBackRunning = ui.checkBox_runBackRunning->isChecked();
lpGlobalConfig::instance()->bRunBackClosing = ui.checkBox_runBackClosing->isChecked();
lpGlobalConfig::instance()->strSysTitle = ui.lineEdit_4->text();
lpGlobalConfig::instance()->saveDeteImage(); lpGlobalConfig::instance()->saveDeteImage();
QString strLanguage = ui.comboBox->currentText(); QString strLanguage = ui.comboBox->currentText();
QSettings languageSetting("hubdetect.ini", QSettings::IniFormat); QSettings languageSetting("hubdetect.ini", QSettings::IniFormat);
languageSetting.setValue("language", strLanguage); languageSetting.setValue("language", strLanguage);
ui.m_label_SaveInfo->setVisible(true);
m_timerID = startTimer(1000);
emit sgUpdateInfo();
} }
else if (strObj == "m_pbExit") { else if (strObj == "m_pbExit") {
this->close(); this->close();
@ -56,6 +64,7 @@ Q_SLOT void lpSystemConfigUI::onButtonClicked()
void lpSystemConfigUI::showEvent(QShowEvent *event) void lpSystemConfigUI::showEvent(QShowEvent *event)
{ {
ui.m_label_SaveInfo->setVisible(false);
ui.checkBox_saveNGCutImg->setChecked(lpGlobalConfig::instance()->bSaveCutNGImg);//ʶ±ð ui.checkBox_saveNGCutImg->setChecked(lpGlobalConfig::instance()->bSaveCutNGImg);//ʶ±ð
ui.checkBox_saveOKCutImg->setChecked(lpGlobalConfig::instance()->bSaveCutOKImg);//ʶ±ð ui.checkBox_saveOKCutImg->setChecked(lpGlobalConfig::instance()->bSaveCutOKImg);//ʶ±ð
ui.checkBox_saveNGSrcImg->setChecked(lpGlobalConfig::instance()->bSaveSrcNGImg);//ʶ±ð ui.checkBox_saveNGSrcImg->setChecked(lpGlobalConfig::instance()->bSaveSrcNGImg);//ʶ±ð
@ -63,6 +72,12 @@ void lpSystemConfigUI::showEvent(QShowEvent *event)
ui.checkBox_saveValue_OKSrcImg->setChecked(lpGlobalConfig::instance()->bSaveSrcOKImg_value);//¶¨Î» ui.checkBox_saveValue_OKSrcImg->setChecked(lpGlobalConfig::instance()->bSaveSrcOKImg_value);//¶¨Î»
ui.checkBox_saveValue_NGSrcImg->setChecked(lpGlobalConfig::instance()->bSaveSrcNGImg_value);//¶¨Î» ui.checkBox_saveValue_NGSrcImg->setChecked(lpGlobalConfig::instance()->bSaveSrcNGImg_value);//¶¨Î»
ui.lineEdit_2->setText(QString("%1").arg(lpGlobalConfig::instance()->tcpServerPort)); ui.lineEdit_2->setText(QString("%1").arg(lpGlobalConfig::instance()->tcpServerPort));
ui.lineEdit_3->setText(QString("%1").arg(lpGlobalConfig::instance()->webSocketPort));
ui.checkBox_runBackRunning->setChecked(lpGlobalConfig::instance()->bRunBackRunning);
ui.checkBox_runBackClosing->setChecked(lpGlobalConfig::instance()->bRunBackClosing);
ui.lineEdit_4->setText(lpGlobalConfig::instance()->strSysTitle);
ui.lineEdit->setText(lpGlobalConfig::instance()->m_SaveImgDirPath); ui.lineEdit->setText(lpGlobalConfig::instance()->m_SaveImgDirPath);
QSettings languageSetting("hubdetect.ini", QSettings::IniFormat); QSettings languageSetting("hubdetect.ini", QSettings::IniFormat);
@ -70,3 +85,15 @@ void lpSystemConfigUI::showEvent(QShowEvent *event)
ui.comboBox->setCurrentText(strLanguage); ui.comboBox->setCurrentText(strLanguage);
} }
void lpSystemConfigUI::timerEvent(QTimerEvent *event)
{
if (m_timerID == event->timerId())
{
killTimer(m_timerID);
m_timerID = 0;
ui.m_label_SaveInfo->setVisible(false);
}
}

@ -11,11 +11,15 @@ class lpSystemConfigUI : public QWidget
public: public:
lpSystemConfigUI(QWidget *parent = Q_NULLPTR); lpSystemConfigUI(QWidget *parent = Q_NULLPTR);
~lpSystemConfigUI(); ~lpSystemConfigUI();
signals:
void sgUpdateInfo();
protected: protected:
Q_SLOT void onButtonClicked(); Q_SLOT void onButtonClicked();
virtual void showEvent(QShowEvent *event); virtual void showEvent(QShowEvent *event);
virtual void timerEvent(QTimerEvent *event);
private: private:
Ui::lpSystemConfigUI ui; Ui::lpSystemConfigUI ui;
int m_timerID{ 0 };
}; };
#endif #endif

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>538</width> <width>597</width>
<height>459</height> <height>500</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -29,8 +29,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>518</width> <width>577</width>
<height>407</height> <height>448</height>
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
@ -162,7 +162,7 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="1"> <item row="0" column="1" colspan="2">
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -175,10 +175,37 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>webSocket端口</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_3"/>
</item>
</layout>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>235</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="4" column="0">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -191,12 +218,60 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="3" column="0">
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>其他:</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>本系统标题:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_4"/>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QCheckBox" name="checkBox_runBackRunning">
<property name="text">
<string>启动时默认后台运行</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_runBackClosing">
<property name="text">
<string>关闭主窗口时在后台运行</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="m_label_SaveInfo">
<property name="text">
<string>系统参数已保存且生效!!!</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">

@ -1230,6 +1230,7 @@
</DebugInformationFormat> </DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<Optimization>Disabled</Optimization>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

@ -130,12 +130,6 @@
<ClCompile Include="GeneratedFiles\Release\moc_qmythread.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_qmythread.cpp">
<Filter>Generated Files\Release</Filter> <Filter>Generated Files\Release</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_ChannelInfo.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_ChannelInfo.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_customtableview.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_customtableview.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
@ -187,54 +181,18 @@
<ClCompile Include="GeneratedFiles\Release\moc_ProgressView.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_ProgressView.cpp">
<Filter>Generated Files\Release</Filter> <Filter>Generated Files\Release</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qaddchanneldlg.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qaddchanneldlg.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qaddmodel.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_qaddmodel.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qaddmodel.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_qaddmodel.cpp">
<Filter>Generated Files\Release</Filter> <Filter>Generated Files\Release</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qaddtimedlg.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qaddtimedlg.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qchannelmanager.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qchannelmanager.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qdia2thsetting.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qdia2thsetting.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qipconfigdlg.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qipconfigdlg.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qmodnamedlg.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_qmodnamedlg.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qmodnamedlg.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_qmodnamedlg.cpp">
<Filter>Generated Files\Release</Filter> <Filter>Generated Files\Release</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qnettickthread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_qnettickthread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_qpulpewidget.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_qpulpewidget.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
@ -265,12 +223,6 @@
<ClCompile Include="GeneratedFiles\Release\moc_qworkItemdlg.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_qworkItemdlg.cpp">
<Filter>Generated Files\Release</Filter> <Filter>Generated Files\Release</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_QWorkMgrCtlr.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_QWorkMgrCtlr.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_saveimgthread.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_saveimgthread.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
@ -292,12 +244,6 @@
<ClCompile Include="..\..\src\tpMain\WheelModel.cpp"> <ClCompile Include="..\..\src\tpMain\WheelModel.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_WheelNet.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_WheelNet.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="..\..\src\tpMain\DetectDataDB.cpp"> <ClCompile Include="..\..\src\tpMain\DetectDataDB.cpp">
<Filter>sql</Filter> <Filter>sql</Filter>
</ClCompile> </ClCompile>
@ -373,24 +319,12 @@
<ClCompile Include="..\..\src\tpMain\qaddmodel.cpp"> <ClCompile Include="..\..\src\tpMain\qaddmodel.cpp">
<Filter>UIFile</Filter> <Filter>UIFile</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_QTimeMgrDlg.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_QTimeMgrDlg.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_QModelMgrDlg.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_QModelMgrDlg.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_QModelMgrDlg.cpp"> <ClCompile Include="GeneratedFiles\Release\moc_QModelMgrDlg.cpp">
<Filter>Generated Files\Release</Filter> <Filter>Generated Files\Release</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_QChannelMgrDlg.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_QChannelMgrDlg.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_QDebugDlg.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_QDebugDlg.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>
@ -460,12 +394,6 @@
<ClCompile Include="..\..\src\tpMain\qpulpewidget.cpp"> <ClCompile Include="..\..\src\tpMain\qpulpewidget.cpp">
<Filter>BaseUILib\pulpewidget</Filter> <Filter>BaseUILib\pulpewidget</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_QSystemSettingDlg.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_QSystemSettingDlg.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_lpGlobalData.cpp"> <ClCompile Include="GeneratedFiles\Debug\moc_lpGlobalData.cpp">
<Filter>Generated Files\Debug</Filter> <Filter>Generated Files\Debug</Filter>
</ClCompile> </ClCompile>

@ -0,0 +1,104 @@
#include "QSignleApplication.h"
#include <QMainWindow>
#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
#include <QFileInfo>
#include <QMessageBox>
#pragma execution_character_set("utf-8")
SingleApplication::SingleApplication(int &args, char **argv, QString strServerName) :
QApplication(args, argv),
instanceRunning(false),
localServer(NULL),
mainWindow(NULL)
{
/**
* localServer
*
*
*/
// serverName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();
m_serverName = strServerName;
QString a = applicationName();
initLocalConnection();
}
void SingleApplication::initLocalConnection()
{
instanceRunning = false;
QLocalSocket socket;
//将套接字连接至进程服务,参数即为进程服务名
socket.connectToServer(m_serverName);
//若在500ms内连接至进程服务说明进程服务已运行
if (socket.waitForConnected(500)) {
instanceRunning = true;
// 其他处理,如:将启动参数发送到进程服务端
QTextStream stream(&socket);
QStringList args = QCoreApplication::arguments();
if (args.count() > 1)
stream << args.last();
else
stream << QString();
stream.flush();
socket.waitForBytesWritten();
return;
}
newLocalServer();//连接不上进程服务器,就创建一个
}
////////////////////////////////////////////////////////////////////////////////
// 说明:
// 创建LocalServer
////////////////////////////////////////////////////////////////////////////////
void SingleApplication::newLocalServer()
{
localServer = new QLocalServer(this);
connect(localServer, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));
if (!localServer->listen(m_serverName)) {
// 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除之
if (localServer->serverError() == QAbstractSocket::AddressInUseError) {
QLocalServer::removeServer(m_serverName); //移除进程服务
localServer->listen(m_serverName); //再次监听
}
}
}
void SingleApplication::newLocalConnection()
{
//监听进程服务,当有数据进来时,可以通过 nextPendingConnection() 获取套接字
QLocalSocket *socket = localServer->nextPendingConnection();
if (!socket)
return;
socket->waitForReadyRead(1000);
//其他处理
QTextStream stream(socket);
delete socket;
if (mainWindow != NULL) {
//当主窗口对象不为空时,说明有可能主窗口被隐藏了,所以需要将其展示在桌面,同时给予用户提示
mainWindow->raise();
mainWindow->activateWindow();
mainWindow->setWindowState((mainWindow->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
mainWindow->show();
//QMessageBox::warning(NULL, "警告", "程序已经启动!");
}
}
////////////////////////////////////////////////////////////////////////////////
// 说明:
// 检查是否已有一个实例在运行, true - 有实例运行, false - 没有实例运行
////////////////////////////////////////////////////////////////////////////////
bool SingleApplication::getInstanceRunning() const
{
return instanceRunning;
}
QMainWindow *SingleApplication::getMainWindow() const
{
return mainWindow;
}
void SingleApplication::setMainWindow(QMainWindow *value)
{
mainWindow = value;
}

@ -0,0 +1,46 @@
#ifndef _H_QSIGNLEAPPLICATION_H_
#define _H_QSIGNLEAPPLICATION_H_
#include <QObject>
#include <QApplication>
class QMainWindow;
class QLocalServer;
class SingleApplication : public QApplication
{
Q_OBJECT
public:
SingleApplication(int &args, char **argv, QString strServerName);
bool getInstanceRunning() const; // 是否已经有实例在运行
QMainWindow *getMainWindow() const;
void setMainWindow(QMainWindow *value);
private slots:
void newLocalConnection();
private:
void initLocalConnection(); // 初始化本地连接
void newLocalServer(); // 创建服务端
bool instanceRunning{ false }; // 是否已经有实例在运行
QLocalServer *localServer{ nullptr }; // 本地socket Server用于本地进程间通信
QString m_serverName; // 服务名称
QMainWindow *mainWindow{ nullptr }; // MainWindow指针
};
/*
Example:
int main(int argc, char *argv[]){
SingleApplication a(argc, argv, "lp_report");
if (!a.getInstanceRunning())
{
slpsf_mark_report w;
a.setMainWindow(&w);
w.show();
return a.exec();
}
return 0;
}
*/
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

@ -0,0 +1,186 @@
/*!
*FileName: SystemTool.cpp
*Author: Pan Yingdong
*Email: bob.pan@hzleaper.com
*Created:2020/6/15 15:28
*Note:
*/
#include "SystemTool.h"
#include <process.h>
#include <QString>
#pragma execution_character_set("utf-8")
bool SystemTool::SystemShutDown(bool bReset)
{
if (bReset == false)
system("shutdown -s -t 00");//关机
else
system("shutdown -r -t 00");//重启
return true;
}
std::string SystemTool::TCHAR2STRING(TCHAR *STR)
{
int iLen = WideCharToMultiByte(CP_ACP, 0, STR, -1, NULL, 0, NULL, NULL);
char* chRtn = new char[iLen * sizeof(char)];
WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL);
std::string str(chRtn);
return str;
}
bool SystemTool::isProcessRunning(const char* processName)
{
bool bFound = false;
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);
while (hRes && !bFound)
{
char* exename = UnicodeToAnsi(pEntry.szExeFile);
QString strExeName(exename);
if (strExeName.compare(processName, Qt::CaseInsensitive) == 0)
{
bFound = true;
}
delete exename;
hRes = Process32Next(hSnapShot, &pEntry);
}
return bFound;
}
void SystemTool::GetProcessPath(DWORD dwProcessID, TCHAR* buffer)
{
TCHAR Filename[MAX_PATH];
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);
if (hProcess == NULL)return;
HMODULE hModule;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded))
{
if (GetModuleFileNameEx(hProcess, hModule, Filename, MAX_PATH)) {
RtlMoveMemory((void*)buffer, Filename, sizeof(TCHAR)*MAX_PATH);
}
}
else {
DWORD size = MAX_PATH;
if (QueryFullProcessImageName(hProcess, 0, Filename, &size)) {
RtlMoveMemory((void*)buffer, Filename, sizeof(TCHAR)*MAX_PATH);
}
}
CloseHandle(hProcess);
}
std::vector<DWORD> SystemTool::getPIDByName(const char* processName)
{
std::vector<DWORD> vecRet;
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);
while (hRes)
{
char* exename = SystemTool::UnicodeToAnsi(pEntry.szExeFile);
QString strExeName(exename);
if (strExeName.compare(processName, Qt::CaseInsensitive) == 0)
{
TCHAR appPath[MAX_PATH];
SystemTool::GetProcessPath((DWORD)pEntry.th32ProcessID, appPath);
std::string texts = SystemTool::TCHAR2STRING(appPath);
// QFileInfo appFile(texts.c_str());
// QString strAppPath = appFile.absoluteFilePath();
// if (strAppPath.compare(curAppPath, Qt::CaseInsensitive) == 0)
{
vecRet.push_back((DWORD)pEntry.th32ProcessID);
}
}
delete exename;
hRes = Process32Next(hSnapShot, &pEntry);
}
CloseHandle(hSnapShot);
return vecRet;
}
void SystemTool::killZombieProcess(const char *curAppName)
{
std::vector<DWORD> PIDs = getPIDByName(curAppName);
for (int i = 0; i < PIDs.size(); ++i)
{
DWORD pid = PIDs.at(i);
// QString strCmd = QString("taskkill /PID %1 -t -f").arg(pid);
// system(strCmd.toStdString().c_str());
//if (pid != curAppPID)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pid);
if (hProcess != NULL)
{
TerminateProcess(hProcess, 9);
CloseHandle(hProcess);
}
}
}
}
QString SystemTool::SecondTimeString(quint64 value)
{
QString strTime;
int seconds = value % 60;
int minutes = value / 60;
strTime = QString("%1分%2秒").arg(minutes).arg(seconds);
if (minutes >= 60) {
minutes = (value / 60) % 60;
int hours = (value / 60) / 60;
strTime = QString("%1时%2分%3秒").arg(hours).arg(minutes).arg(seconds);
if (hours >= 24) {
hours = ((value / 60) / 60) % 24;
int day = ((value / 60) / 60) / 24;
strTime = QString("%1天%2时%3分%4秒").arg(day).arg(hours).arg(minutes).arg(seconds);
}
}
return strTime;
}
void SystemTool::ReflashBarIcon()
{
// HWND hShellTrayWnd = FindWindow("Shell_TrayWnd", NULL);
// //任务栏右边托盘图标+时间区
// HWND hTrayNotifyWnd = FindWindowEx(hShellTrayWnd, 0, "TrayNotifyWnd", NULL);
// //不同系统可能有可能没有这层
// HWND hSysPager = FindWindowEx(hTrayNotifyWnd, 0, "SysPager", NULL);
// //托盘图标窗口
// HWND hToolbarWindow32;
// if (hSysPager)
// {
// hToolbarWindow32 = FindWindowEx(hSysPager, 0, "ToolbarWindow32", NULL);
// }
// else
// {
// hToolbarWindow32 = FindWindowEx(hTrayNotifyWnd, 0, "ToolbarWindow32", NULL);
// }
// if (hToolbarWindow32)
// {
// RECT r;
// ::GetWindowRect(hToolbarWindow32, &r);
// int width = r.right - r.left;
// int height = r.bottom - r.top;
// //从任务栏中间从左到右 MOUSEMOVE一遍所有图标状态会被更新
// for (int x = 1; x < width; x++)
// {
// ::SendMessage(hToolbarWindow32, WM_MOUSEMOVE, 0, MAKELPARAM(x, height / 2));
// }
// }
}

@ -0,0 +1,50 @@
/*!
*FileName: SystemTool.h
*Author: Pan Yingdong
*Email: bob.pan@hzleaper.com
*Created:2020/6/15 15:14
*Note:
*/
#ifndef _H_SYSTEMTOOL_H_
#define _H_SYSTEMTOOL_H_
#include <vector>
#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
#define PSAPI_VERSION 1
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
#include <vector>
#include <QString>
namespace SystemTool
{/*bReset == true ÖØÆô; false ¹Ø»ú*/
bool SystemShutDown(bool bReset);
inline char* UnicodeToAnsi(const wchar_t* szStr)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL);
if (nLen == 0)
{
return NULL;
}
char* pResult = new char[nLen];
WideCharToMultiByte(CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL);
return pResult;
}
std::string TCHAR2STRING(TCHAR *STR);
bool isProcessRunning(const char* processName);
void GetProcessPath(DWORD dwProcessID, TCHAR* buffer);
std::vector<DWORD> getPIDByName(const char* processName);
void killZombieProcess(const char *curAppName);
QString SecondTimeString(quint64 value);
void ReflashBarIcon();
}
#endif

@ -0,0 +1,5 @@
[General]
urlA=ws://localhost:10110
urlB=ws://localhost:10111
appPathA=E:/wheelValve/runner17/Enchanter.exe
appPathB=E:/wheelValve/runner17/lpReportd.exe

@ -14,10 +14,19 @@ void lpConfig::saveConfig()
{ {
QSettings setting("config.ini", QSettings::IniFormat); QSettings setting("config.ini", QSettings::IniFormat);
setting.setValue("urlA", strUrlA);
setting.setValue("urlB", strUrlB);
setting.setValue("appPathA", appPathA);
setting.setValue("appPathB", appPathB);
setting.setValue("doubleStation", doubleStation);
} }
void lpConfig::loadConfig() void lpConfig::loadConfig()
{ {
QSettings setting("config.ini", QSettings::IniFormat); QSettings setting("config.ini", QSettings::IniFormat);
strUrlA = setting.value("urlA", "ws://localhost:10110").toString();
strUrlB = setting.value("urlB", "ws://localhost:10111").toString();
appPathA = setting.value("appPathA").toString();
appPathB = setting.value("appPathB").toString();
doubleStation = setting.value("doubleStation",true).toBool();
} }

@ -16,6 +16,9 @@ public:
public: public:
QString strUrlA{ "ws://localhost:10110" };//A²à¹¤Î»websocket Á´½Ó QString strUrlA{ "ws://localhost:10110" };//A²à¹¤Î»websocket Á´½Ó
QString strUrlB{ "ws://localhost:10110" }; QString strUrlB{ "ws://localhost:10110" };
QString appPathA;
QString appPathB;
bool doubleStation{ true };
}; };
#endif #endif

@ -1,11 +1,27 @@
#include "lpConfigUI.h" #include "lpConfigUI.h"
#include <lpConfig.h>
#include <QFileDialog>
#include <QApplication>
#include <QStandardPaths>
#pragma execution_character_set("utf-8")
/*系统参数配置页面*/
const QString gStrAppName = "识别定位系统";
lpConfigUI::lpConfigUI(QWidget *parent) lpConfigUI::lpConfigUI(QWidget *parent)
: QWidget(parent) : QWidget(parent)
{ {
ui.setupUi(this); ui.setupUi(this);
setWindowIcon(QIcon(":/Resources/icon.png"));
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
ui.label_5->setVisible(false);
onInitCheckBox();
connect(ui.checkBox_AutoRun, SIGNAL(stateChanged(int)), this, SLOT(onCheckBoxChanged(int)));
connect(ui.checkBox_DesktopShort, SIGNAL(stateChanged(int)), this, SLOT(onCheckBoxChanged(int)));
} }
lpConfigUI::~lpConfigUI() lpConfigUI::~lpConfigUI()
@ -14,10 +30,183 @@ lpConfigUI::~lpConfigUI()
Q_SLOT void lpConfigUI::onButtonClicked() Q_SLOT void lpConfigUI::onButtonClicked()
{ {
QString strObj = sender()->objectName();
if ("pushButton" == strObj)
{
QString strUrl = QFileDialog::getOpenFileName(this, "", "", "*.exe");
ui.lineEdit_APath->setText(strUrl);
}
else if ("pushButton_2" == strObj)
{
QString strUrl = QFileDialog::getOpenFileName(this, "", "", "*.exe");
ui.lineEdit_BPath->setText(strUrl);
}
else if ("pushButton_3" == strObj)
{
lpConfig::instance()->appPathA = ui.lineEdit_APath->text();
lpConfig::instance()->appPathB = ui.lineEdit_BPath->text();
lpConfig::instance()->strUrlA = ui.lineEdit_AUrl->text();
lpConfig::instance()->strUrlB = ui.lineEdit_BUrl->text();
lpConfig::instance()->saveConfig();
ui.label_5->setVisible(true);
m_timerID = startTimer(1000);
}
else if ("pushButton_4" == strObj)
{
this->close();
}
} }
void lpConfigUI::showEvent(QShowEvent *event) void lpConfigUI::showEvent(QShowEvent *event)
{ {
ui.lineEdit_APath->setText(lpConfig::instance()->appPathA);
ui.lineEdit_BPath->setText(lpConfig::instance()->appPathB);
ui.lineEdit_AUrl->setText(lpConfig::instance()->strUrlA);
ui.lineEdit_BUrl->setText(lpConfig::instance()->strUrlB);
}
void lpConfigUI::timerEvent(QTimerEvent *event)
{
if (m_timerID == event->timerId())
{
killTimer(m_timerID);
m_timerID = 0;
ui.label_5->setVisible(false);
}
}
void lpConfigUI::onInitCheckBox()
{
bool bAutoRun = CheckAutoRunLink();
if (bAutoRun == true)
{
ui.checkBox_AutoRun->setChecked(true);
}
else {
ui.checkBox_AutoRun->setChecked(false);
}
bool bDesktop = CheckDesktopLink();
if (bDesktop == true)
{
ui.checkBox_DesktopShort->setChecked(true);
}
else
{
ui.checkBox_DesktopShort->setChecked(false);
}
}
Q_SLOT void lpConfigUI::onCheckBoxChanged(int state)
{
QString strObj = sender()->objectName();
if ("checkBox_AutoRun" == strObj)
{
if (state == 0)
{
RemoveAutoRunLink();
}
else {
CreateAutoRunLink();
}
}
else if ("checkBox_DesktopShort" == strObj)
{
if (state == 0)
{
RemoveDesktopLink();
}
else {
CreateDesktopLink();
}
}
}
bool lpConfigUI::CheckDesktopLink()
{
QString strDesktopLink = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/";
strDesktopLink += gStrAppName + ".lnk";
QFileInfo dir(strDesktopLink);
return dir.isFile();
}
void lpConfigUI::CreateDesktopLink()
{
QString strAppPath = QCoreApplication::applicationFilePath();//要创建快捷方式的应用程序绝对路径
QFile fApp(strAppPath);
//创建桌面快捷方式
QString strDesktopLink = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/";
strDesktopLink += gStrAppName + ".lnk";
QFileInfo dir(strDesktopLink);
//if (!dir.isFile())
{
fApp.link(strDesktopLink);
}
}
void lpConfigUI::RemoveDesktopLink()
{
QString strAppPath = QCoreApplication::applicationFilePath();//要创建快捷方式的应用程序绝对路径
QFile fApp(strAppPath);
//创建桌面快捷方式
QString strDesktopLink = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/";
strDesktopLink += gStrAppName + ".lnk";
QFileInfo dir(strDesktopLink);
//if (!dir.isFile())
{
fApp.remove(strDesktopLink);
}
}
bool lpConfigUI::CheckAutoRunLink()
{
QString strMenuLink = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/";
strMenuLink += "Startup/";
QDir pathDir;
pathDir.mkpath(strMenuLink);
strMenuLink += gStrAppName + ".lnk";
//判断是否已存在
QFileInfo dir(strMenuLink);
return dir.isFile();
}
void lpConfigUI::CreateAutoRunLink()
{
QString strAppPath = QCoreApplication::applicationFilePath();//要创建快捷方式的应用程序绝对路径
QFile fApp(strAppPath);
//创建开机启动快捷方式
QString strMenuLink = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/";
strMenuLink += "Startup/";
QDir pathDir;
pathDir.mkpath(strMenuLink);
strMenuLink += gStrAppName + ".lnk";
//判断是否已存在
QFileInfo dir(strMenuLink);
//if (!dir.isFile())
{
fApp.link(strMenuLink);
}
}
void lpConfigUI::RemoveAutoRunLink()
{
QString strAppPath = QCoreApplication::applicationFilePath();//要创建快捷方式的应用程序绝对路径
QFile fApp(strAppPath);
QString strMenuLink = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/";
strMenuLink += "Startup/";
QDir pathDir;
pathDir.mkpath(strMenuLink);
strMenuLink += gStrAppName + ".lnk";
//判断是否已存在
QFileInfo dir(strMenuLink);
//if (!dir.isFile())
{
fApp.remove(strMenuLink);
}
} }

@ -12,12 +12,27 @@ public:
lpConfigUI(QWidget *parent = Q_NULLPTR); lpConfigUI(QWidget *parent = Q_NULLPTR);
~lpConfigUI(); ~lpConfigUI();
protected:
Q_SLOT void onButtonClicked(); Q_SLOT void onButtonClicked();
virtual void showEvent(QShowEvent *event); virtual void showEvent(QShowEvent *event);
virtual void timerEvent(QTimerEvent *event);
private:
void onInitCheckBox();
Q_SLOT void onCheckBoxChanged(int state);
private:
bool CheckDesktopLink();
void CreateDesktopLink();
void RemoveDesktopLink();
bool CheckAutoRunLink();
void CreateAutoRunLink();
void RemoveAutoRunLink();
private: private:
Ui::lpConfigUI ui; Ui::lpConfigUI ui;
int m_timerID{ 0 };
}; };
#endif #endif

@ -6,39 +6,238 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>628</width> <width>545</width>
<height>444</height> <height>303</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>lpConfigUI</string> <string>lpConfigUI</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>A侧检测所在路径</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_APath">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton"> <widget class="QPushButton" name="pushButton">
<property name="geometry"> <property name="font">
<rect> <font>
<x>360</x> <pointsize>12</pointsize>
<y>30</y> </font>
<width>75</width>
<height>23</height>
</rect>
</property> </property>
<property name="text"> <property name="text">
<string>PushButton</string> <string>设置</string>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label"> </item>
<property name="geometry"> </layout>
<rect> </item>
<x>20</x> <item row="1" column="0">
<y>20</y> <layout class="QHBoxLayout" name="horizontalLayout_3">
<width>111</width> <item>
<height>16</height> <widget class="QLabel" name="label_3">
</rect> <property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>A侧检测通讯链接</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_AUrl">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>B侧检测所在路径</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_BPath">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>设置</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>B侧检测通讯链接</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_BUrl">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>参数已保存!!!</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>应用</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_4">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>退出</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox_AutoRun">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>开机自启动</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBox_DesktopShort">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property> </property>
<property name="text"> <property name="text">
<string>A侧检测所在目录</string> <string>添加到桌面快捷方式</string>
</property> </property>
</widget> </widget>
</item>
</layout>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources/> <resources/>

@ -5,7 +5,7 @@ lpDebugUI::lpDebugUI(QWidget *parent)
{ {
ui.setupUi(this); ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
setWindowIcon(QIcon(":/Resources/icon.png"));
} }
lpDebugUI::~lpDebugUI() lpDebugUI::~lpDebugUI()

@ -1,10 +1,15 @@
#include "valueMainUI.h" #include "valueMainUI.h"
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include "QSignleApplication.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); SingleApplication a(argc, argv,"valueMain");
if (!a.getInstanceRunning())
{
valueMainUI w; valueMainUI w;
w.show(); w.show();
a.setMainWindow(&w);
return a.exec(); return a.exec();
}
return 0;
} }

@ -0,0 +1,16 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 valueMainUI.rc 使用
//
#define IDI_ICON1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

@ -2,15 +2,21 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include "lpConfig.h" #include "lpConfig.h"
#include <QProcess>
#include "SystemTool.h"
#include <QFileInfo>
#include <QMessageBox>
#include "QSettings"
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
#define WINDOWICON ":/Resources/icon.png"
valueMainUI::valueMainUI(QWidget *parent) valueMainUI::valueMainUI(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
{ {
setWindowTitle(tr("识别定位一体检测系统"));
ui.setupUi(this); ui.setupUi(this);
setupTrayIcon();
setWindowIcon(QIcon(WINDOWICON));
setWindowTitle(tr("识别定位一体检测系统"));
m_pLabelA = new QLabel(this); m_pLabelA = new QLabel(this);
m_pLabelB = new QLabel(this); m_pLabelB = new QLabel(this);
m_pLabelSystem = new QLabel(this); m_pLabelSystem = new QLabel(this);
@ -29,14 +35,15 @@ valueMainUI::valueMainUI(QWidget *parent)
m_pLabelB->setAlignment(Qt::AlignCenter); m_pLabelB->setAlignment(Qt::AlignCenter);
m_pLabelSystem->setAlignment(Qt::AlignCenter); m_pLabelSystem->setAlignment(Qt::AlignCenter);
ui.statusBar->addWidget(m_pLabelA,50); ui.statusBar->addWidget(m_pLabelA, 50);
ui.statusBar->addWidget(m_pLabelB,50); ui.statusBar->addWidget(m_pLabelB, 50);
ui.statusBar->addPermanentWidget(m_pLabelSystem,50); ui.statusBar->addPermanentWidget(m_pLabelSystem, 50);
{ {
QGridLayout *pLayout_A = new QGridLayout(ui.widget_A); QGridLayout *pLayout_A = new QGridLayout(ui.widget_A);
m_ImgViewer_A = new RoiImgViewer(ui.widget_A); m_ImgViewer_A = new RoiImgViewer(ui.widget_A);
m_ImgViewer_A->setObjectName("m_ImgViewer_A"); m_ImgViewer_A->setObjectName("m_ImgViewer_A");
connect(m_ImgViewer_A, SIGNAL(sgImageScale(qreal)), this, SLOT(onImageScale(qreal)));
pLayout_A->addWidget(m_ImgViewer_A); pLayout_A->addWidget(m_ImgViewer_A);
ui.widget_A->setLayout(pLayout_A); ui.widget_A->setLayout(pLayout_A);
@ -45,6 +52,13 @@ valueMainUI::valueMainUI(QWidget *parent)
m_ImgViewer_B->setObjectName("m_ImgViewer_B"); m_ImgViewer_B->setObjectName("m_ImgViewer_B");
pLayout_B->addWidget(m_ImgViewer_B); pLayout_B->addWidget(m_ImgViewer_B);
ui.widget_B->setLayout(pLayout_B); ui.widget_B->setLayout(pLayout_B);
QString strPath = QApplication::applicationDirPath() + "/showImg.ini";
QSettings setting(strPath, QSettings::IniFormat);
double nScale_A = setting.value("ShowImg/ScaleA", 0.53).toDouble();
double nScale_B = setting.value("ShowImg/ScaleB", 0.53).toDouble();
m_ImgViewer_A->setInitScale(nScale_A);
m_ImgViewer_B->setInitScale(nScale_B);
} }
{ {
m_pClient_A = new webClient(); m_pClient_A = new webClient();
@ -68,19 +82,24 @@ valueMainUI::valueMainUI(QWidget *parent)
connect(ui.actionsettingB, SIGNAL(triggered()), this, SLOT(onButtonClicked())); connect(ui.actionsettingB, SIGNAL(triggered()), this, SLOT(onButtonClicked()));
connect(ui.actionConfig, SIGNAL(triggered()), this, SLOT(onButtonClicked())); connect(ui.actionConfig, SIGNAL(triggered()), this, SLOT(onButtonClicked()));
connect(ui.actiondebug, SIGNAL(triggered()), this, SLOT(onButtonClicked())); connect(ui.actiondebug, SIGNAL(triggered()), this, SLOT(onButtonClicked()));
//connect(ui.actionsettingA, SIGNAL(triggered()), this, SLOT(onButtonClicked()));
m_pConfigUI = new lpConfigUI(); m_pConfigUI = new lpConfigUI();
m_pDebugUI = new lpDebugUI(); m_pDebugUI = new lpDebugUI();
connect(m_pDebugUI, SIGNAL(sgButtonClicked(int)), this, SLOT(onDebugClicked(int))); connect(m_pDebugUI, SIGNAL(sgButtonClicked(int)), this, SLOT(onDebugClicked(int)));
m_SysTimerID = startTimer(1000); m_SysTimerID = startTimer(1000);
lpConfig::instance()->loadConfig();
onConnectA(); onConnectA();
if (lpConfig::instance()->doubleStation == true)
{
onConnectB(); onConnectB();
}
m_timerStartID = startTimer(2000);
} }
valueMainUI::~valueMainUI() valueMainUI::~valueMainUI()
{ {
onStopProcess();
{ {
m_task_A.quit(); m_task_A.quit();
m_task_A.wait(); m_task_A.wait();
@ -259,7 +278,6 @@ Q_SLOT void valueMainUI::onButtonClicked()
} }
else if (strObj == "actiondebug") else if (strObj == "actiondebug")
{ {
//m_timer = startTimer(5000);
m_pDebugUI->setParent(this); m_pDebugUI->setParent(this);
m_pDebugUI->setWindowTitle(tr("调试页面")); m_pDebugUI->setWindowTitle(tr("调试页面"));
m_pDebugUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_pDebugUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
@ -267,16 +285,18 @@ Q_SLOT void valueMainUI::onButtonClicked()
m_pDebugUI->setWindowModality(Qt::ApplicationModal); m_pDebugUI->setWindowModality(Qt::ApplicationModal);
m_pDebugUI->setAttribute(Qt::WA_ShowModal, true); m_pDebugUI->setAttribute(Qt::WA_ShowModal, true);
m_pDebugUI->show(); m_pDebugUI->show();
} }
else if (strObj == "actionConfig") else if (strObj == "actionConfig")
{ {
m_pConfigUI->setParent(this); m_pConfigUI->setParent(this);
m_pConfigUI->setWindowTitle(tr("调试页面")); m_pConfigUI->setWindowTitle(tr("系统参数配置页面"));
m_pConfigUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_pConfigUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pConfigUI->setWindowIcon(QIcon(":/image/leaper")); m_pConfigUI->setWindowIcon(QIcon(":/image/leaper"));
m_pConfigUI->setWindowModality(Qt::ApplicationModal); m_pConfigUI->setWindowModality(Qt::ApplicationModal);
m_pConfigUI->setAttribute(Qt::WA_ShowModal, true); m_pConfigUI->setAttribute(Qt::WA_ShowModal, true);
m_pConfigUI->show(); m_pConfigUI->show();
//check();
} }
} }
@ -299,8 +319,9 @@ void valueMainUI::timerEvent(QTimerEvent *event)
QJsonObject sObj; QJsonObject sObj;
sObj.insert("cmd", "trigerCam"); sObj.insert("cmd", "trigerCam");
m_pClient_A->onSendJson(sObj); m_pClient_A->onSendJson(sObj);
m_pClient_B->onSendJson(sObj);
} }
else if (m_SysTimerID = event->timerId()) else if (m_SysTimerID == event->timerId())
{ {
m_tickCount++; m_tickCount++;
m_CoutB++; m_CoutB++;
@ -350,6 +371,35 @@ void valueMainUI::timerEvent(QTimerEvent *event)
} }
} }
else if (m_timerStartID == event->timerId())
{
killTimer(m_timerStartID);
m_timerStartID = 0;
onStartProcess();
}
}
void valueMainUI::closeEvent(QCloseEvent *event)
{
QMessageBox info(this);
info.setWindowIcon(QIcon(WINDOWICON));
info.setWindowTitle(QObject::tr("警告"));
info.setText(QObject::tr("本检测系统正在运行,您真的要关闭?"));
info.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
info.setButtonText(QMessageBox::Ok, QObject::tr("关闭"));
info.setButtonText(QMessageBox::Cancel, QObject::tr("后台运行"));
if (info.exec() != QMessageBox::Ok)
{
m_bExit = false;
if (m_bExit == false)
{
setMainWindowVisibility(false);
return event->ignore();
}
}
return event->accept();
} }
Q_SLOT void valueMainUI::onDebugClicked(int nID) Q_SLOT void valueMainUI::onDebugClicked(int nID)
@ -382,7 +432,6 @@ Q_SLOT void valueMainUI::onConnected_A(bool bFalg)
ui.textEdit->append("设备已连接"); ui.textEdit->append("设备已连接");
} }
} }
} }
Q_SLOT void valueMainUI::onConnected_B(bool bFalg) Q_SLOT void valueMainUI::onConnected_B(bool bFalg)
@ -400,5 +449,123 @@ Q_SLOT void valueMainUI::onConnected_B(bool bFalg)
ui.textEdit_2->append("设备已连接"); ui.textEdit_2->append("设备已连接");
} }
} }
}
void valueMainUI::check()
{
QString strExeName = QString("%1.exe").arg("Enchanter");
QProcess process(this);
QString strCMD = QString("wmic process where caption=\"%1\" get caption,commandline /value").arg(strExeName);
process.start(strCMD);
process.waitForStarted();
process.waitForFinished();
QString strTmp = QString(process.readAllStandardOutput());
bool bRun = false;
if (strTmp.contains(strExeName))
bRun = true;
}
void valueMainUI::onRunApp(QString strAppPath)
{
QProcess *process = new QProcess(this);
QFileInfo fileInfo(strAppPath);
QString strPath = fileInfo.absolutePath();
QString strExeName = fileInfo.fileName();
m_appNames.append(strExeName);
//process->setWorkingDirectory(strPath);
process->startDetached(strAppPath, QStringList(), strPath);
bool ret = process->waitForStarted();
if (ret) {
qDebug() << "start ok";
}
else {
qDebug() << "start failed";
}
}
Q_SLOT void valueMainUI::onStartProcess()
{
QString strAppPath = lpConfig::instance()->appPathA;
if (strAppPath.isEmpty())
return;
onRunApp(lpConfig::instance()->appPathA);
onRunApp(lpConfig::instance()->appPathB);
}
Q_SLOT void valueMainUI::onStopProcess()
{
foreach(QString var, m_appNames) {
QString strExeName = QString("%1").arg(var);
SystemTool::killZombieProcess(strExeName.toStdString().c_str());
}
}
void valueMainUI::setupTrayIcon()
{
m_trayIcon = new QSystemTrayIcon(this);
m_trayIconMenu = new QMenu(this);
m_restoreAction = new QAction(tr("后台运行"), this);
m_quitAction = new QAction(tr("退出"), this);
m_trayIconMenu->addAction(m_restoreAction);
m_trayIconMenu->addSeparator();
m_trayIconMenu->addAction(m_quitAction);
QIcon icon(":/Resources/icon.png");
m_trayIcon->setIcon(icon);
m_trayIcon->setContextMenu(m_trayIconMenu);
m_trayIcon->show();
connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason)));
connect(m_restoreAction, &QAction::triggered, this, [this]() {
setMainWindowVisibility(isHidden()
|| windowState() == Qt::WindowMinimized
|| (qApp->applicationState() == Qt::ApplicationInactive));
});
connect(m_quitAction, &QAction::triggered, this, &valueMainUI::onQuitApplication);
}
Q_SLOT void valueMainUI::onActivated(QSystemTrayIcon::ActivationReason reason)
{
if (reason == QSystemTrayIcon::DoubleClick)
{
setMainWindowVisibility(true);
}
}
void valueMainUI::setMainWindowVisibility(bool state)
{
if (state) {
show();
qApp->processEvents();
qApp->setActiveWindow(this);
qApp->processEvents();
m_restoreAction->setText(tr("后台运行"));
}
else {
m_restoreAction->setText(tr("显示界面"));
hide();
}
}
Q_SLOT void valueMainUI::onQuitApplication()
{
m_bExit = true;
valueMainUI::close();
}
Q_SLOT void valueMainUI::onImageScale(qreal value)
{
QString strPath = QApplication::applicationDirPath() + "/showImg.ini";
QSettings setting(strPath, QSettings::IniFormat);
QObject *obj = sender();
if (m_ImgViewer_A == obj)
{
setting.setValue("ShowImg/ScaleA", value);
}
else if (m_ImgViewer_B == obj)
{
setting.setValue("ShowImg/ScaleB", value);
}
} }

@ -8,6 +8,9 @@
#include "RoiImgViewer.h" #include "RoiImgViewer.h"
#include "lpConfigUI.h" #include "lpConfigUI.h"
#include "lpDebugUI.h" #include "lpDebugUI.h"
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
class valueMainUI : public QMainWindow class valueMainUI : public QMainWindow
{ {
@ -26,10 +29,23 @@ public:
Q_SLOT void onButtonClicked(); Q_SLOT void onButtonClicked();
QJsonObject byte2Json(QByteArray data); QJsonObject byte2Json(QByteArray data);
QByteArray Json2byte(QJsonObject obj); QByteArray Json2byte(QJsonObject obj);
virtual void timerEvent(QTimerEvent *event);
Q_SLOT void onDebugClicked(int nID); Q_SLOT void onDebugClicked(int nID);
Q_SLOT void onConnected_A(bool bFalg); Q_SLOT void onConnected_A(bool bFalg);
Q_SLOT void onConnected_B(bool bFalg); Q_SLOT void onConnected_B(bool bFalg);
void check();
void onRunApp(QString strPath);
Q_SLOT void onStartProcess();
Q_SLOT void onStopProcess();
private://trayIcon
void setupTrayIcon();
Q_SLOT void onActivated(QSystemTrayIcon::ActivationReason reason);
void setMainWindowVisibility(bool state);
Q_SLOT void onQuitApplication();
Q_SLOT void onImageScale(qreal real);
protected:
virtual void timerEvent(QTimerEvent *event);
virtual void closeEvent(QCloseEvent *event);
private: private:
Ui::valueMainUIClass ui; Ui::valueMainUIClass ui;
@ -47,6 +63,7 @@ private:
QThread m_task_B; QThread m_task_B;
int m_timer{ 0 }; int m_timer{ 0 };
int m_timerStartID{ 0 };
lpConfigUI *m_pConfigUI{ nullptr }; lpConfigUI *m_pConfigUI{ nullptr };
lpDebugUI *m_pDebugUI{ nullptr }; lpDebugUI *m_pDebugUI{ nullptr };
@ -56,8 +73,15 @@ private:
bool m_bServerB{ false }; bool m_bServerB{ false };
int m_SysTimerID{ 0 }; int m_SysTimerID{ 0 };
quint64 m_tickCount{ 0 }; quint64 m_tickCount{ 0 };
QStringList m_appNames;//´Ó»úappÃû
private:
QSystemTrayIcon* m_trayIcon{ nullptr };
QMenu* m_trayIconMenu{ nullptr };
QAction* m_restoreAction{ nullptr };
QAction* m_quitAction{ nullptr };
bool m_bExit{ false };
}; };
#endif #endif

@ -1,4 +1,7 @@
<RCC> <RCC>
<qresource prefix="valueMainUI"> <qresource prefix="/">
<file>Resources/icon.png</file>
<file>Resources/Client.png</file>
<file>Resources/Setting.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>970</width> <width>918</width>
<height>691</height> <height>617</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -17,6 +17,12 @@
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>5</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font"> <property name="font">
<font> <font>
<pointsize>12</pointsize> <pointsize>12</pointsize>
@ -26,31 +32,40 @@
<string>A侧检测工位</string> <string>A侧检测工位</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="1" column="0" colspan="3"> <item row="0" column="0">
<widget class="QTextEdit" name="textEdit"> <widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="widget_A" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>5</verstretch> <verstretch>8</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</item> <widget class="QTextEdit" name="textEdit">
<item row="0" column="0" colspan="3">
<widget class="QWidget" name="widget_A" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>5</verstretch> <verstretch>1</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>5</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font"> <property name="font">
<font> <font>
<pointsize>12</pointsize> <pointsize>12</pointsize>
@ -60,25 +75,28 @@
<string>B侧检测工位</string> <string>B侧检测工位</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0" colspan="2"> <item row="0" column="0">
<widget class="QTextEdit" name="textEdit_2"> <widget class="QSplitter" name="splitter_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="widget_B" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>5</verstretch> <verstretch>8</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</item> <widget class="QTextEdit" name="textEdit_2">
<item row="0" column="0" colspan="2">
<widget class="QWidget" name="widget_B" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>5</verstretch> <verstretch>1</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -87,9 +105,15 @@
</widget> </widget>
<widget class="QStatusBar" name="statusBar"/> <widget class="QStatusBar" name="statusBar"/>
<widget class="QToolBar" name="toolBar"> <widget class="QToolBar" name="toolBar">
<property name="contextMenuPolicy">
<enum>Qt::NoContextMenu</enum>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>toolBar</string> <string>toolBar</string>
</property> </property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<attribute name="toolBarArea"> <attribute name="toolBarArea">
<enum>TopToolBarArea</enum> <enum>TopToolBarArea</enum>
</attribute> </attribute>
@ -102,6 +126,10 @@
<addaction name="actiondebug"/> <addaction name="actiondebug"/>
</widget> </widget>
<action name="actionsettingA"> <action name="actionsettingA">
<property name="icon">
<iconset resource="valueMainUI.qrc">
<normaloff>:/Resources/Client.png</normaloff>:/Resources/Client.png</iconset>
</property>
<property name="text"> <property name="text">
<string>A侧设置</string> <string>A侧设置</string>
</property> </property>
@ -112,6 +140,10 @@
</property> </property>
</action> </action>
<action name="actionsettingB"> <action name="actionsettingB">
<property name="icon">
<iconset resource="valueMainUI.qrc">
<normaloff>:/Resources/Client.png</normaloff>:/Resources/Client.png</iconset>
</property>
<property name="text"> <property name="text">
<string>B侧设置</string> <string>B侧设置</string>
</property> </property>
@ -122,6 +154,10 @@
</property> </property>
</action> </action>
<action name="actionConfig"> <action name="actionConfig">
<property name="icon">
<iconset resource="valueMainUI.qrc">
<normaloff>:/Resources/Setting.png</normaloff>:/Resources/Setting.png</iconset>
</property>
<property name="text"> <property name="text">
<string>系统设置</string> <string>系统设置</string>
</property> </property>

@ -52,8 +52,8 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@ -64,13 +64,13 @@
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile> <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5WebSocketsd.lib;Qt5Widgetsd.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5WebSocketsd.lib;Qt5Widgetsd.lib;Qt5Locationd.lib;Qt5Networkd.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<QtMoc> <QtMoc>
<OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile> <OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile>
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
<IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase;%(AdditionalIncludeDirectories)</IncludePath> <IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;%(AdditionalIncludeDirectories)</IncludePath>
<Define>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</Define> <Define>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;%(PreprocessorDefinitions)</Define>
</QtMoc> </QtMoc>
<QtUic> <QtUic>
<ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription>
@ -84,8 +84,8 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat /> <DebugInformationFormat />
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@ -95,13 +95,13 @@
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile> <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>false</GenerateDebugInformation> <GenerateDebugInformation>false</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5WebSockets.lib;Qt5Widgets.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5WebSockets.lib;Qt5Widgets.lib;Qt5Location.lib;Qt5Network.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<QtMoc> <QtMoc>
<OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile> <OutputFile>.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</OutputFile>
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
<IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</IncludePath> <IncludePath>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;%(AdditionalIncludeDirectories)</IncludePath>
<Define>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</Define> <Define>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;%(PreprocessorDefinitions)</Define>
</QtMoc> </QtMoc>
<QtUic> <QtUic>
<ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription> <ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription>
@ -125,6 +125,8 @@
<ClCompile Include="lpConfigUI.cpp" /> <ClCompile Include="lpConfigUI.cpp" />
<ClCompile Include="lpDebugUI.cpp" /> <ClCompile Include="lpDebugUI.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="QSignleApplication.cpp" />
<ClCompile Include="SystemTool.cpp" />
<ClCompile Include="valueMainUI.cpp" /> <ClCompile Include="valueMainUI.cpp" />
<ClCompile Include="webClient.cpp" /> <ClCompile Include="webClient.cpp" />
</ItemGroup> </ItemGroup>
@ -153,6 +155,12 @@
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase</IncludePath> <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets</IncludePath> <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets</IncludePath>
</ClInclude> </ClInclude>
<QtMoc Include="QSignleApplication.h">
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase</IncludePath>
</QtMoc>
<ClInclude Include="resource.h" />
<ClInclude Include="SystemTool.h" />
<QtMoc Include="lpDebugUI.h"> <QtMoc Include="lpDebugUI.h">
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase</IncludePath> <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;.\..\..\src\tpMain\algela;E:\wheelValve\3part\tadpole\include\tpBase</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets</IncludePath> <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets</IncludePath>
@ -178,6 +186,12 @@
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets</IncludePath> <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets</IncludePath>
</QtMoc> </QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ResourceCompile Include="valueMainUI.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="Resources\icon.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')"> <ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
<Import Project="$(QtMsBuild)\qt.targets" /> <Import Project="$(QtMsBuild)\qt.targets" />

@ -75,6 +75,12 @@
<ClCompile Include="lpDebugUI.cpp"> <ClCompile Include="lpDebugUI.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="SystemTool.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="QSignleApplication.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="valueMainUI.h"> <QtMoc Include="valueMainUI.h">
@ -101,6 +107,9 @@
<QtMoc Include="lpDebugUI.h"> <QtMoc Include="lpDebugUI.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="QSignleApplication.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtUic Include="valueMainUI.ui"> <QtUic Include="valueMainUI.ui">
@ -131,5 +140,17 @@
<ClInclude Include="lpConfig.h"> <ClInclude Include="lpConfig.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="SystemTool.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="valueMainUI.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="Resources\icon.ico" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -27,6 +27,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tpCamVirtual", "tpCamVirtua
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Enchanter", "Enchanter\Enchanter.vcxproj", "{7B76D75A-0E01-451E-880E-FB9AC63A914B}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Enchanter", "Enchanter\Enchanter.vcxproj", "{7B76D75A-0E01-451E-880E-FB9AC63A914B}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tpCamHik", "tpCamHik\tpCamHik.vcxproj", "{64C9A32D-82E8-4C36-9AA6-52D58B23F687}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
@ -113,12 +115,20 @@ Global
{7B76D75A-0E01-451E-880E-FB9AC63A914B}.Release|x64.ActiveCfg = Release|x64 {7B76D75A-0E01-451E-880E-FB9AC63A914B}.Release|x64.ActiveCfg = Release|x64
{7B76D75A-0E01-451E-880E-FB9AC63A914B}.Release|x64.Build.0 = Release|x64 {7B76D75A-0E01-451E-880E-FB9AC63A914B}.Release|x64.Build.0 = Release|x64
{7B76D75A-0E01-451E-880E-FB9AC63A914B}.Release|x86.ActiveCfg = Release|x64 {7B76D75A-0E01-451E-880E-FB9AC63A914B}.Release|x86.ActiveCfg = Release|x64
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x64.ActiveCfg = Debug|x64
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x64.Build.0 = Debug|x64
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x86.ActiveCfg = Debug|Win32
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x86.Build.0 = Debug|Win32
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x64.ActiveCfg = Release|x64
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x64.Build.0 = Release|x64
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x86.ActiveCfg = Release|Win32
{64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CD365F32-5EAC-4A16-AD47-BFB1D8E5511A}
Qt5Version = qt5.9.4-msvc2017-x64 Qt5Version = qt5.9.4-msvc2017-x64
SolutionGuid = {CD365F32-5EAC-4A16-AD47-BFB1D8E5511A}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

Loading…
Cancel
Save