Init: 首次提交, 功能完成, 裁剪锁眼地图.
commit
19bf16cc89
|
|
@ -0,0 +1,5 @@
|
||||||
|
################################################################################
|
||||||
|
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
/build
|
||||||
|
|
@ -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})
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 102 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 148 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
|
|
@ -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();
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue