Init: 首次提交, 功能完成, 裁剪锁眼地图.

master
hssheng 2024-12-30 14:37:54 +08:00
commit 19bf16cc89
6 changed files with 297 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
################################################################################
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################
/build

35
CMakeLists.txt Normal file
View File

@ -0,0 +1,35 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
# project name
PROJECT(cutImg)
# release debug
SET(CMAKE_BUILD_TYPE release)
# head file
file(GLOB HEAD_LIST
${PROJECT_SOURCE_DIR}/src/*.h ${PROJECT_SOURCE_DIR}/src/*.hpp )
# direction of source file
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.cpp)
# direction of head file
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src)
add_executable(${PROJECT_NAME} ${HEAD_LIST} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} -lSDL)
# openMP
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
# opencv
set(OpenCV_DIR "C:\\Toolkits\\OpenCV\\x64\\vc15\\lib")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

BIN
cutImg.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
data/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
data/1_cut.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

257
src/main.cpp Normal file
View File

@ -0,0 +1,257 @@
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <windows.h>
#include <commdlg.h>
using namespace cv;
using namespace std;
cv::Mat img;
bool select_flag = false;
cv::Rect m_select;
cv::Point origin;
int ROI_count;
void onMouseRectPicking(int event, int x, int y, int, void*)
{
if (select_flag)
{
m_select.x = MIN(origin.x, x);//不一定要等鼠标弹起才计算矩形框,而应该在鼠标按下开始到弹起这段时间实时计算所选矩形框
m_select.y = MIN(origin.y, y);
m_select.width = abs(x - origin.x);//算矩形宽度和高度
m_select.height = abs(y - origin.y);
m_select &= cv::Rect(0, 0, img.cols, img.rows);//保证所选矩形框在视频显示区域之内
}
if (event == CV_EVENT_LBUTTONDOWN)
{
select_flag = true; //鼠标按下的标志赋真值
origin = cv::Point(x, y); //保存下来单击捕捉到的点
m_select = cv::Rect(x, y, 0, 0); //这里一定要初始化,宽和高为(0,0)是因为在opencv中Rect矩形框类内的点是包含左上角那个点的但是不含右下角那个点
}
else if (event == CV_EVENT_LBUTTONUP)
{
select_flag = false;
ROI_count++;
}
}
int main(int argc, char* argv[])
{
//.....................................................................
// QT for open TIF image
//.....................................................................
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = (LPCSTR)(LPCWSTR)"TIF Img(*.tif*)\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))
{
std::cout << szFile << std::endl;
}
std::string filename;
#ifndef UNICODE
filename = szFile;
#else
std::wstring wStr = szFile;
filename = std::string(wStr.begin(), wStr.end());
#endif
// check filename
if (filename.length() < 1)
{
std::cout << "Sorry! No image!" << std::endl;
return -1;
}
if (FILE* file = fopen(filename.c_str(), "r"))
{
fclose(file);
}
else
{
std::cout << "Sorry! No image!" << std::endl;
return -1;
}
//std::string filePath = "../data/1.png";
std::string filePath = filename;
img = imread(filePath);
// get file name prefix
int preFixId = filePath.find_last_of('.');
int lastPoai = filePath.length() - 1;
std::string prfixPath = filePath.substr(0, preFixId);
std::string ptfixPath = filePath.substr(preFixId, filePath.length());
std::string cutFilePath = prfixPath + "_cut" + ptfixPath;
// resample
int down_width = 1600;
int down_height = img.rows * down_width / img.cols;
cv::Size2i down_points{ down_width, down_height };
cv::Mat imgR;
cv::resize(img, imgR, down_points, cv::INTER_LINEAR);
bool stop = false;
cv::namedWindow("capframe", CV_WINDOW_AUTOSIZE);
cv::setMouseCallback("capframe", onMouseRectPicking, 0);
char pic_name[40];
ROI_count = 0;
cv::Mat imgLine;
while (!stop)
{
imgLine = imgR.clone();
cv::rectangle(imgLine, m_select, cv::Scalar(255, 0, 0), 2, 8, 0); // 画矩形框
cv::imshow("capframe", imgLine);
char key = cv::waitKey(30);
if (key == 27)
stop = true;
}
waitKey(0);
// orignal
double ratioW0 = m_select.x * 1.0 / down_width;
double ratioH0 = m_select.y * 1.0 / down_height;
cv::Rect m_selectOri;
m_selectOri.x = floor(ratioW0 * img.cols);
m_selectOri.y = floor(ratioH0 * img.rows);
m_selectOri.width = floor(m_select.width * img.cols * 1.0 / down_width);
m_selectOri.height = floor(m_select.height * img.rows * 1.0 / down_height);
Mat ROI = img(m_selectOri);
imwrite(cutFilePath, ROI);
printf("Write cut image successfully!!!");
return 0;
}
//#include <iostream>
//
//#include"opencv2/opencv.hpp"
//#include"opencv2/highgui.hpp"
//
//
//// 鼠标事件数据结构体
//struct onMouseData
//{
//public:
// cv::Mat kSrcImg; // 原始图像
// cv::Mat kDrawImg; // 绘图图像
// cv::Point kPointer; // 当前鼠标坐标
// cv::Point kRectTopLeft; // ROI左上角坐标
// cv::Point kRectBottomRight; // ROI左下角坐标
// cv::Rect kRoi; // ROI矩形框信息
// cv::Scalar kLineColor; // 矩形框线条颜色
// int kLineWidth; // 矩形框线条款图
// std::string kWiddget; // 绘图窗口名
// bool isDrawing; // 当前是否正在绘制ROI
// onMouseData()
// {
// kLineColor = cv::Scalar(0, 0, 255);
// kRectTopLeft = { -1, -1 };
// kRectBottomRight = { -1, -1 };
// kPointer = { -1, -1 };
// isDrawing = false;
// kLineWidth = 3;
// }
//};
//
//// 实时绘制ROI
//void drawRoi(onMouseData* kMouseData);
//
//// 鼠标事件回调函数
//void onMouseCallBack(int event, int x, int y, int flags, void* param);
//
//// ROI选择功能函数
//void selectROI(const std::string& kWiddget, const cv::Mat& kSrcImg, onMouseData& kMouseData);
//
//int main()
//{
// cv::Mat kSrcImg = cv::imread("../data/1.png");
// std::string mainWidget = "ROI框选";
// cv::namedWindow(mainWidget, cv::WINDOW_KEEPRATIO);
// cv::resizeWindow(mainWidget, 1280, 800);
// onMouseData kMouseData;
// selectROI(mainWidget, kSrcImg, kMouseData);
// std::cout << kMouseData.kRoi << std::endl;
// system("pause");
// cv::destroyAllWindows();
// return 0;
//}
//
//void drawRoi(onMouseData* kMouseData)
//{
// if (kMouseData->isDrawing)
// {
// kMouseData->kRoi.x = kMouseData->kRectTopLeft.x;
// kMouseData->kRoi.y = kMouseData->kRectTopLeft.y;
// kMouseData->kRoi.width = kMouseData->kPointer.x - kMouseData->kRectTopLeft.x;
// kMouseData->kRoi.height = kMouseData->kPointer.y - kMouseData->kRectTopLeft.y;
// cv::rectangle(kMouseData->kDrawImg,
// kMouseData->kRoi,
// kMouseData->kLineColor,
// kMouseData->kLineWidth, cv::LINE_8, 0);
// cv::imshow(kMouseData->kWiddget, kMouseData->kDrawImg);
// }
//}
//void onMouseCallBack(int event, int x, int y, int flags, void* param)
//{
// onMouseData* kMouseData = reinterpret_cast<onMouseData*>(param);
// kMouseData->kDrawImg = kMouseData->kSrcImg.clone();
// kMouseData->kPointer = { x, y };
//
// switch (event)
// {
// case cv::EVENT_LBUTTONDOWN:
// kMouseData->kRectTopLeft = kMouseData->kPointer;
// kMouseData->isDrawing = !kMouseData->isDrawing;
// drawRoi(kMouseData);
// break;
//
// case cv::EVENT_LBUTTONUP:
// kMouseData->kRectBottomRight = kMouseData->kPointer;
// kMouseData->isDrawing = false;
// break;
//
// case cv::EVENT_MOUSEMOVE:
// kMouseData->kRectBottomRight = kMouseData->kPointer;
// drawRoi(kMouseData);
// break;
//
// case cv::EVENT_RBUTTONDOWN:
// kMouseData->isDrawing = false;
//
// default:
// break;
// }
//}
//void selectROI(const std::string& kWiddget, const cv::Mat& kSrcImg, onMouseData& kMouseData)
//{
// kMouseData.kSrcImg = kSrcImg.clone();
// kMouseData.kWiddget = kWiddget;
// cv::imshow(kMouseData.kWiddget, kMouseData.kSrcImg);
// cv::setMouseCallback(kMouseData.kWiddget,
// onMouseCallBack,
// reinterpret_cast<void*>(&kMouseData));
// cv::waitKey();
//}
//
//
//