1、创建固定位置小视口
#include <opencv2/opencv.hpp>
bool isDragging = false;
cv::Point startPt;
void onMouse(int event, int x, int y, int flags, void* userdata) {
if (event == cv::EVENT_LBUTTONDOWN) {
isDragging = true;
startPt = cv::Point(x, y);
} else if (event == cv::EVENT_MOUSEMOVE && isDragging) {
cv::Mat* image = static_cast<cv::Mat*>(userdata);
cv::Rect roi(startPt, cv::Point(x, y));
cv::Mat subwindow = (*image)(roi);
cv::imshow("Subwindow", subwindow);
} else if (event == cv::EVENT_LBUTTONUP) {
isDragging = false;
}
}
int main() {
// 读取图像
cv::Mat image = cv::imread("path/to/your/image.jpg");
// 显示原始图像
cv::imshow("Original Image", image);
// 设置鼠标回调函数
cv::setMouseCallback("Original Image", onMouse, &image);
// 等待按键
cv::waitKey(0);
return 0;
}
2、结合鼠标事件,创建可移动视口
#include <opencv2/opencv.hpp>
bool isDragging = false;
cv::Point startPt;
void onMouse(int event, int x, int y, int flags, void* userdata) {
if (event == cv::EVENT_LBUTTONDOWN) {
isDragging = true;
startPt = cv::Point(x, y);
} else if (event == cv::EVENT_MOUSEMOVE && isDragging) {
cv::Mat* image = static_cast<cv::Mat*>(userdata);
cv::Rect roi(startPt, cv::Point(x, y));
cv::Mat subwindow = (*image)(roi);
cv::imshow("Subwindow", subwindow);
} else if (event == cv::EVENT_LBUTTONUP) {
isDragging = false;
}
}
int main() {
// 读取图像
cv::Mat image = cv::imread("path/to/your/image.jpg");
// 显示原始图像
cv::imshow("Original Image", image);
// 设置鼠标回调函数
cv::setMouseCallback("Original Image", onMouse, &image);
// 等待按键
cv::waitKey(0);
return 0;
}
定义了一个全局变量 isDragging 来表示是否正在拖动视口,以及 startPt 来记录拖动的起始位置。我们还定义了一个鼠标事件回调函数 onMouse,在这个函数中处理鼠标的点击、移动和释放事件。当用户按下鼠标左键时,我们记录起始点;当鼠标移动且正在拖动时,根据起始点和当前位置计算出小视口的 ROI,并显示该小视口;当释放鼠标左键时,停止拖动。