完善抠图逻辑,屏蔽越界

master
bob.pan 5 years ago
parent 592c491ac2
commit c8334361ac

@ -3,6 +3,7 @@
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QDirIterator> #include <QDirIterator>
#include <QFileDialog>
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
@ -11,6 +12,7 @@ AlgoTest::AlgoTest(QWidget *parent)
{ {
ui.setupUi(this); ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
connect(ui.m_pbSelect, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
{ {
QGridLayout *pLayout = new QGridLayout(ui.widget_src); QGridLayout *pLayout = new QGridLayout(ui.widget_src);
@ -24,7 +26,9 @@ AlgoTest::AlgoTest(QWidget *parent)
pLayout->addWidget(m_rltView); pLayout->addWidget(m_rltView);
ui.widget_rlt->setLayout(pLayout); ui.widget_rlt->setLayout(pLayout);
} }
loadImage(); QString strPath = "H:\\н¨Îļþ¼Ð\\Source\\";
//QString strPath = "H:\\н¨Îļþ¼Ð\\7\\";
loadImage(strPath);
m_pAlg = new QAlgDetect(); m_pAlg = new QAlgDetect();
} }
@ -47,10 +51,11 @@ AlgoTest::~AlgoTest()
} }
} }
void AlgoTest::loadImage() void AlgoTest::loadImage(QString strPath)
{ {
QString strPath = "H:\\新建文件夹\\Source\\"; m_filelst.clear();
//QString strPath = "H:\\新建文件夹\\7\\"; m_gIndex = 0;
QStringList fileFilter; QStringList fileFilter;
fileFilter<< "*.BMP" << "*.JPEG" << "*.JPG" << "*.PNG"; fileFilter<< "*.BMP" << "*.JPEG" << "*.JPG" << "*.PNG";
@ -79,6 +84,7 @@ Q_SLOT void AlgoTest::onButtonClicked()
if (m_gIndex >= m_filelst.size()) if (m_gIndex >= m_filelst.size())
m_gIndex = 0; m_gIndex = 0;
QString strPath = m_filelst.at(m_gIndex); QString strPath = m_filelst.at(m_gIndex);
ui.label->setText(strPath);
m_gIndex++; m_gIndex++;
QImage img; QImage img;
@ -87,8 +93,19 @@ Q_SLOT void AlgoTest::onButtonClicked()
{ {
m_srcView->setImg(img); m_srcView->setImg(img);
} }
bool bCheck = ui.checkBox->isChecked();
AlgCallBack func = std::bind(&AlgoTest::algCallFunc, this, std::placeholders::_1); AlgCallBack func = std::bind(&AlgoTest::algCallFunc, this, std::placeholders::_1);
m_pAlg->detect(img, func); QVariantMap param;
param.insert("equal", bCheck);
m_pAlg->detect(img, param, func);
}
else if ("m_pbSelect" == strObj)
{
QString dirPath = QFileDialog::getExistingDirectory(this, "", "");
if (dirPath.isEmpty())
return;
loadImage(dirPath);
} }
} }

@ -13,7 +13,7 @@ class AlgoTest : public QMainWindow
public: public:
AlgoTest(QWidget *parent = Q_NULLPTR); AlgoTest(QWidget *parent = Q_NULLPTR);
~AlgoTest(); ~AlgoTest();
void loadImage(); void loadImage(QString strPath);
void algCallFunc(QImage img); void algCallFunc(QImage img);
Q_SLOT void onButtonClicked(); Q_SLOT void onButtonClicked();
private: private:

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>681</width> <width>804</width>
<height>748</height> <height>666</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -15,14 +15,7 @@
</property> </property>
<widget class="QWidget" name="centralWidget"> <widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="1"> <item row="3" column="1">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -35,7 +28,21 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="0" rowspan="2"> <item row="1" column="1">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>run</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="m_pbSelect">
<property name="text">
<string>select</string>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="4">
<widget class="QWidget" name="widget" native="true"> <widget class="QWidget" name="widget" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@ -63,7 +70,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>结果</string> <string>抠图结果</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
@ -79,6 +86,20 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>使用增强</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>

@ -85,7 +85,7 @@
<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_WIDGETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_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;E:\wheelValve\3part\opencv3.4.1\include;E:\wheelValve\3part\opencv3.4.1\include\opencv;E:\wheelValve\3part\opencv3.4.1\include\opencv2;E:\wheelValve\src\tpMain\algela;E:\wheelValve\3part\edcircle\include;E:\wheelValve\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat /> <DebugInformationFormat />
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@ -93,14 +93,14 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile> <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;E:\wheelValve\3part\opencv3.4.1\x64\vc15\lib;E:\wheelValve\3part\edcircle\lib;E:\wheelValve\3part\Cyclops\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;opencv_world341.lib;EDCircle.lib;Cyclops.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;E:\wheelValve\3part\opencv3.4.1\include;E:\wheelValve\3part\opencv3.4.1\include\opencv;E:\wheelValve\3part\opencv3.4.1\include\opencv2;E:\wheelValve\src\tpMain\algela;E:\wheelValve\3part\edcircle\include;E:\wheelValve\3part\Cyclops\include;%(AdditionalIncludeDirectories)</IncludePath>
<Define>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</Define> <Define>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</Define>
</QtMoc> </QtMoc>
<QtUic> <QtUic>

@ -104,8 +104,10 @@ QAlgDetect::~QAlgDetect()
#define REAIZE 4 #define REAIZE 4
void QAlgDetect::detect(QImage img, AlgCallBack func) void QAlgDetect::detect(QImage img, QVariantMap param, AlgCallBack func)
{ {
bool bEqual = param.value("equal").toBool();
Mat srcImg = QImageToMat(img); Mat srcImg = QImageToMat(img);
if(srcImg.channels()!=1) if(srcImg.channels()!=1)
cv::cvtColor(srcImg, srcImg, CV_RGB2GRAY); cv::cvtColor(srcImg, srcImg, CV_RGB2GRAY);
@ -115,7 +117,8 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
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;
// equalizeHist(detectImg, detectImg);//根据图像的实际情况使用 图像暗一点不需要,亮一点的需要 if(bEqual == true)
equalizeHist(detectImg, detectImg);//根据图像的实际情况使用 图像暗一点不需要,亮一点的需要
detectImg = _EnhanImg_sharpen(detectImg); detectImg = _EnhanImg_sharpen(detectImg);
EDCircles edcircles(detectImg); EDCircles edcircles(detectImg);
@ -130,6 +133,8 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
continue; continue;
if (EDCircle[i].center.x + EDCircle[i].r > bBaseX || EDCircle[i].center.y + EDCircle[i].r > bBaseY) if (EDCircle[i].center.x + EDCircle[i].r > bBaseX || EDCircle[i].center.y + EDCircle[i].r > bBaseY)
continue; continue;
if(EDCircle[i].r< 50 )
continue;
if (EDCircle[i].r > maxR) if (EDCircle[i].r > maxR)
{ {
maxR = EDCircle[i].r; maxR = EDCircle[i].r;
@ -147,56 +152,25 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
centerP.setX(EDCircle[nIndex].center.x * REAIZE); centerP.setX(EDCircle[nIndex].center.x * REAIZE);
centerP.setY(EDCircle[nIndex].center.y * REAIZE); centerP.setY(EDCircle[nIndex].center.y * REAIZE);
double r = radius * REAIZE; double r = radius * REAIZE;
Mat aa = DetectCircle(srcImg, centerP, r); Mat aa = DetectCircle(srcImg, centerP, r, bEqual);
QImage rltImg = cvMat2QImage(aa); QImage rltImg = cvMat2QImage(aa);
if (func) { if (func) {
func(rltImg); func(rltImg);
return; return;
} }
if (startX > 0 && startY > 0 && hight > 0 \
&& startX < src.cols &&startY < src.rows \
&& hight < src.cols&&hight < src.rows \
&& (startX + hight) < src.cols && (startY + hight) < src.rows)
{
Mat cutMat = src(Rect(startX, startY, hight, hight));
if (cutMat.data != NULL)
{
// if (hight < 50)
// return Mat();
// pCircle->ptCenter = center;
// pCircle->fRadius = radius * REAIZE;
//2021-05-10 增加图像大小判断 对超过900像素的图像进行再一次压缩
if (cutMat.cols >= 900 || cutMat.rows >= 900)
{
Mat newCutImg;
cv::resize(cutMat, newCutImg, cv::Size(cutMat.cols / REAIZE, cutMat.rows / REAIZE));
// pCircle->fRadius = pCircle->fRadius / REAIZE;
// return newCutImg;
QImage rltImg = cvMat2QImage(newCutImg);
if (func) {
func(rltImg);
return;
}
} }
else { else {
QImage rltImg = cvMat2QImage(cutMat); QPointF centerP;
centerP.setX(srcImg.cols/2);
centerP.setY(srcImg.rows/2);
double r = 0;
Mat aa = DetectCircle(srcImg, centerP, r, bEqual);
QImage rltImg = cvMat2QImage(aa);
if (func) { if (func) {
func(rltImg); func(rltImg);
return; return;
} }
} }
}
}
}
if (func) if (func)
{ {
@ -205,10 +179,12 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
} }
Mat QAlgDetect::DetectCircle(Mat img, QPointF center, double radius) Mat QAlgDetect::DetectCircle(Mat img, QPointF center, double radius,bool bEqual)
{ {
Mat detectImg; Mat detectImg;
//equalizeHist(img, detectImg); if(bEqual == true)
equalizeHist(img, detectImg);
else
detectImg = img; detectImg = img;
CircleDetector cd; CircleDetector cd;
cd.setAlgoType(CircleDetector::PeakCircle); cd.setAlgoType(CircleDetector::PeakCircle);
@ -237,6 +213,10 @@ Mat QAlgDetect::DetectCircle(Mat img, QPointF center, double radius)
Rect rect; Rect rect;
rect.x = cen.x() - r; rect.x = cen.x() - r;
rect.y = cen.y() - r; rect.y = cen.y() - r;
if (rect.x < 0)
rect.x = 0;
if (rect.y < 0)
rect.y = 0;
rect.width = 2 * r; rect.width = 2 * r;
rect.height = 2 * r; rect.height = 2 * r;
Mat s = img(rect); Mat s = img(rect);

@ -4,6 +4,7 @@
#include <QObject> #include <QObject>
#include <opencv.hpp> #include <opencv.hpp>
#include <QImage> #include <QImage>
#include <QVariantMap>
using namespace cv; using namespace cv;
typedef std::function<void(QImage)> AlgCallBack; typedef std::function<void(QImage)> AlgCallBack;
@ -15,8 +16,8 @@ public:
QAlgDetect(QObject *parent = nullptr); QAlgDetect(QObject *parent = nullptr);
~QAlgDetect(); ~QAlgDetect();
void detect(QImage img, AlgCallBack func); void detect(QImage img, QVariantMap param, AlgCallBack func);
Mat DetectCircle(Mat img, QPointF center, double radius); Mat DetectCircle(Mat img, QPointF center, double radius, bool bEqual);
private: private:
}; };

Loading…
Cancel
Save