From cd4f29355170d1f5e6da343c654d2751c305c881 Mon Sep 17 00:00:00 2001 From: taynpg Date: Thu, 26 Dec 2024 15:55:16 +0800 Subject: [PATCH] =?UTF-8?q?base=EF=BC=9A=E5=9F=BA=E6=9C=AC=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E6=98=BE=E7=A4=BA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 ++++ CMakeLists.txt | 2 +- MainFrame.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++ MainFrame.h | 9 ++++++++ WinImg.cpp | 29 +++++++++++++++++++++++ WinImg.h | 19 +++++++++++++++ 6 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 WinImg.cpp create mode 100644 WinImg.h diff --git a/.vscode/settings.json b/.vscode/settings.json index 16b39fa..57bf029 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -31,5 +31,9 @@ "ja": true, "zh-hant": true, "zh-hans": true + }, + "files.associations": { + "any": "cpp", + "filesystem": "cpp" } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7787125..7bbb978 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,6 @@ add_subdirectory(ofen) find_package(wxWidgets CONFIG REQUIRED) find_package(OpenCV CONFIG REQUIRED) -add_executable(PictureTool main.cpp MainFrame.h MainFrame.cpp) +add_executable(PictureTool main.cpp MainFrame.h MainFrame.cpp WinImg.h WinImg.cpp) target_link_libraries(PictureTool PRIVATE wx::core wx::base Ofen ${OpenCV_LIBS}) set_target_properties(PictureTool PROPERTIES WIN32_EXECUTABLE TRUE) \ No newline at end of file diff --git a/MainFrame.cpp b/MainFrame.cpp index 07a39d8..14abe0b 100644 --- a/MainFrame.cpp +++ b/MainFrame.cpp @@ -1,9 +1,63 @@ #include "MainFrame.h" +constexpr auto g_Border = 2; CMainFrame::CMainFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) { + SetSize(wxSize(600, 300)); + init(); } CMainFrame::~CMainFrame() { } + +void CMainFrame::init() +{ + auto* panel = new wxPanel(this); + auto* sizerTop = new wxBoxSizer(wxVERTICAL); + + auto* sizeA = new wxBoxSizer(wxHORIZONTAL); + auto* pic_path = new wxTextCtrl(panel, wxID_ANY); + auto* select_pic = new wxButton(panel, wxID_ANY, wxT("选择")); + sizeA->Add(pic_path, 1, wxALL | wxEXPAND, g_Border); + sizeA->Add(select_pic, 0, wxALL, g_Border); + sizerTop->Add(sizeA, 0, wxALL | wxEXPAND, g_Border); + + win_img_ = new CImagePanel(panel); + sizerTop->Add(win_img_, 1, wxALL | wxEXPAND, g_Border); + img_ = cv::imread("D:/2.png"); + win_img_->set_img(img_); + + auto* sizeB = new wxBoxSizer(wxHORIZONTAL); + auto* btn2Blue = new wxButton(panel, wxID_ANY, wxT("蓝底")); + auto* btn2White = new wxButton(panel, wxID_ANY, wxT("白底")); + sizeB->Add(btn2Blue, 1, wxALL | wxEXPAND, g_Border); + sizeB->Add(btn2White, 1, wxALL | wxEXPAND, g_Border); + + btn2Blue->Bind(wxEVT_BUTTON, &CMainFrame::turn2blue, this); + btn2White->Bind(wxEVT_BUTTON, &CMainFrame::turn2white, this); + sizerTop->Add(sizeB, 0, wxALL | wxEXPAND, g_Border); + + panel->SetSizer(sizerTop); + panel->Layout(); +} + +void CMainFrame::turn2blue(wxCommandEvent& event) +{ + // 定义白色的阈值范围 + cv::Scalar lowerWhite(200, 200, 200); // 白色下限 (B, G, R) + cv::Scalar upperWhite(255, 255, 255); // 白色上限 (B, G, R) + + // 创建蓝色背景 + cv::Mat mask; + cv::inRange(img_, lowerWhite, upperWhite, mask); // 检测白色区域 + + // 将白色区域替换为蓝色 + cv::Mat blueBackground(img_.size(), img_.type(), cv::Scalar(255, 0, 0)); // 蓝色 (B, G, R) + blueBackground.copyTo(img_, mask); // 通过掩码复制蓝色区域到原图 + win_img_->set_img(img_); +} + +void CMainFrame::turn2white(wxCommandEvent& event) +{ +} diff --git a/MainFrame.h b/MainFrame.h index 3b287c9..a8e42ed 100644 --- a/MainFrame.h +++ b/MainFrame.h @@ -1,5 +1,6 @@ #pragma once #include +#include "WinImg.h" class CMainFrame : public wxFrame { @@ -7,5 +8,13 @@ public: CMainFrame(const wxString& title); virtual ~CMainFrame(); public: + void init(); +private: + void turn2blue(wxCommandEvent& event); + void turn2white(wxCommandEvent& event); + +private: + cv::Mat img_; + CImagePanel* win_img_; }; \ No newline at end of file diff --git a/WinImg.cpp b/WinImg.cpp new file mode 100644 index 0000000..2e29d95 --- /dev/null +++ b/WinImg.cpp @@ -0,0 +1,29 @@ +#include "WinImg.h" + +CImagePanel::CImagePanel(wxWindow* parent) + : wxPanel(parent), bitmap_(wxNullBitmap) +{ + Bind(wxEVT_PAINT, &CImagePanel::OnPaint, this); +} + +void CImagePanel::set_img(const cv::Mat& img) +{ + if (img.empty()) { + return; + } + + cv::Mat rgb_img; + cv::cvtColor(img, rgb_img, cv::COLOR_BGR2RGB); + + wxImage wimg(rgb_img.cols, rgb_img.rows, rgb_img.data, true); + bitmap_ = wxBitmap(wimg); + Refresh(); +} + +void CImagePanel::OnPaint(wxPaintEvent& event) +{ + wxPaintDC dc(this); + if (bitmap_.IsOk()) { + dc.DrawBitmap(bitmap_, 0, 0, false); + } +} diff --git a/WinImg.h b/WinImg.h new file mode 100644 index 0000000..f5f01b7 --- /dev/null +++ b/WinImg.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +class CImagePanel : public wxPanel +{ +public: + CImagePanel(wxWindow* parent); + +public: + void set_img(const cv::Mat& img); + +protected: + void OnPaint(wxPaintEvent& event); + +private: + wxBitmap bitmap_; +}; \ No newline at end of file