首页 > 其他分享 >opencv imshow 大图片显示,拖动显示

opencv imshow 大图片显示,拖动显示

时间:2024-12-13 11:12:51浏览次数:3  
标签:disp roi Point 拖动 imshow opencv lt mp cv

用imshow显示大图片,不能完整显示,不方便。
结合网友的代码,修改成现在的代码,可以拖动图片,方便查看完整图片。
而且方便调试,只需要用MatShow替换imshow。
struct MouseParam
{
    int m_WinWidth; //窗口大小
    int m_WinHeight;

    cv::String m_WinName;//窗口名称

    cv::Point m_RoiLeftUp; //Roi区域左上角在原图中的坐标,初始值为(0,0)
    cv::Mat m_Roi; //最终显示出来的Roi区域的图像矩阵

    cv::Mat m_Src; //原始图像

    cv::Point m_StartDrag;
    cv::Point m_EndDrag;
    bool m_Dragging;

    cv::Point m_PrevMouse;
};

void onm ouse(int event, int x, int y, int flags, void* param)
{
    MouseParam * mp = (MouseParam*)param;

    cv::Point &prevMouse = mp->m_PrevMouse;
    int &roi_width = mp->m_WinWidth;
    int &roi_height = mp->m_WinHeight; // 可以根据自己的显示屏分辨率自行设置
    cv::Point &roi_lt = mp->m_RoiLeftUp; // roi区域左上角在原图中的坐标,初始值为(0,0)
    cv::Mat &roi = mp->m_Roi; // 最终显示出来的roi区域的图像矩阵
    
    cv::Point &startDrag = mp->m_StartDrag;
    cv::Point &endDrag = mp->m_EndDrag;
    bool &dragging = mp->m_Dragging;

    cv::Mat disp = mp->m_Src.clone();

    cv::String &winName = mp->m_WinName;

    if (event == cv::EVENT_LBUTTONDOWN)
    {// 如果鼠标左键按下,则为开始拖动,记录下拖动起始点,并将dragging标志位设为true
        startDrag = cv::Point(x, y);
        prevMouse = startDrag;
        dragging = true;
    }
    else if (event == cv::EVENT_LBUTTONUP)
    {// 如果鼠标左键松开,则为结束拖动,记录下拖动结束点,并将其与拖动起始点的差值加在roi_lt上,并将dragging标志位设为false
        //cv::Mat disp = (*(cv::Mat*)param).clone();
        endDrag = cv::Point(x, y);
        roi_lt += (startDrag - endDrag);
        // 判断拖动终点是否超出边界
        if (roi_lt.x < 0) roi_lt.x = 0;
        if (roi_lt.y < 0) roi_lt.y = 0;
        if (roi_lt.x > (disp.cols - roi_width)) roi_lt.x = disp.cols - roi_width;
        if (roi_lt.y > (disp.rows - roi_height))roi_lt.y = disp.rows - roi_height;
        dragging = false;
        // 在原图disp上裁剪出roi区域内的像素并显示
        cv::Rect roiRect(roi_lt.x, roi_lt.y, roi_width, roi_height);
        roi = disp(roiRect).clone();
        cv::imshow(winName, roi);
    }
    else if (event == cv::EVENT_MOUSEMOVE && dragging)
    {// 如果鼠标在按住左键的状态下移动,则一直更新画面
        //cv::Mat disp = (*(cv::Mat*)param).clone();
        cv::Point mousePos(x, y);
        roi_lt += (prevMouse - mousePos);
        if (roi_lt.x < 0) roi_lt.x = 0;
        if (roi_lt.y < 0) roi_lt.y = 0;
        if (roi_lt.x > (disp.cols - roi_width)) roi_lt.x = disp.cols - roi_width;
        if (roi_lt.y > (disp.rows - roi_height))roi_lt.y = disp.rows - roi_height;
        prevMouse = mousePos;
        cv::Rect roiRect(roi_lt.x, roi_lt.y, roi_width, roi_height);
        roi = disp(roiRect).clone();
        cv::imshow(winName, roi);
    }
}

void MatShow(const cv::String &winname,cv::Mat &mat)
{
    MouseParam * mp = new MouseParam;
    mp->m_WinWidth = 1000;
    mp->m_WinHeight= 800;
    mp->m_WinName = winname;
    mp->m_Src = mat.clone();

    cv::Rect roiRect(mp->m_RoiLeftUp.x, mp->m_RoiLeftUp.y, mp->m_WinWidth, mp->m_WinHeight);
    mp->m_Roi = mat(roiRect).clone(); // roi

    cv::namedWindow(winname);
    cv::resizeWindow(winname, cv::Size(mp->m_WinWidth, mp->m_WinHeight));
    cv::setMouseCallback(winname, onm ouse, mp); // whole display image
    
    cv::imshow(winname, mp->m_Roi);
}

 


用MatShow替换imshow

标签:disp,roi,Point,拖动,imshow,opencv,lt,mp,cv
From: https://www.cnblogs.com/SamFang/p/18604466

相关文章

  • opencv编译随笔
    编译目标本文将记录在Linux下编译Opencv及其扩展contrib,并记录在这过程中发生的问题。环境需求操作系统:Ubuntu20.04CMake:3.22.1及以上Make:4.2.1gcc/g++:9.4.0联网需求:是准备拉取OpenCV和opencv_contrib代码,得到两个代码文件夹opencv和opencv_contribhttps:/......
  • 学习笔记 | OpenCV的安装及其主要模块
    OpenSourceComputerVisionLibrary|开源的计算机视觉库官网:https://opencv.org/帮助文档:https://docs.opencv.org/4.x/index.htmlOpenCV是一个完整的计算机视觉处理框架。OpenCV的安装#方式一:cmd命令行安装pip3installopencv-python#方式二:从镜像源下载:pip3i......
  • opencv的骨架提取代码实现
    opencv实现图像骨架提取文章目录一.图像骨架提取二.ximgproc.thinning三.使用腐蚀和开运算实现一.图像骨架提取骨架提取,也叫二值图像细化。这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示。二.ximgproc.thinning下载包opencv-con......
  • 利用OpenCV和Numpy实现图像校正
    实验原理图像透视变换是一种几何变换,它能够将图像中的点从一个平面映射到另一个平面,通常用于校正图像中的透视失真或者创建特殊的视觉效果。在计算机视觉和图像处理中,透视变换可以通过找到一组对应点(原图中的点和目标图中的点)并计算透视变换矩阵来实现。透视变换的关键步骤:......
  • opencv - py_photo - py_inpainting 图像修复
    文章目录图像修复目标基础知识代码其他资源练习图像修复目标在本章中,我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音、笔触等我们将看到OpenCV中的修复功能。基础知识你们大多数人家里都会有一些旧的劣化照片,上面有一些黑点、一些笔触等。你有......
  • Python OpenCV按照像素点图片切割
    图像分割是从图像处理到图像分析的关键步骤,在目标检测、特征提取、图像识别等领域具有广泛应用。OpenCV是一个强大的计算机视觉库,提供了多种图像分割方法。本文将详细介绍如何使用Python和OpenCV进行基于像素点的图像分割,包括阈值分割、自适应阈值分割、Otsu's二值化、分水岭算法......
  • OpenCV的简单函数
    一、二值化(threshold)1.二值化图二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。2.实现方法,函数阈值法(THRESH_BINARY)反阈值法(THRESH_BINARY_INV)截断阈值法(THRESH_TRUNC):低阈值零处理(THRESH_TOZERO)超阈值零处理(THRESH_TOZERO_INV)OTSU阈......
  • 安装OpenCV时遇到pip install指令无效的问题
    解决方法:将pipinstallopencv-python改为pip3installopencv-python,即可成功安装。pip和pip3的区别概念方面pip是Python的包管理工具,用于安装和管理Python软件包。它默认是关联到Python2.x版本(如果系统中同时安装了Python2和Python3)。pip3专门用于管理Python3.x版......
  • 【opencv基础】resize使用的问题
    前言最近语义分割任务的gt文件resize前后标签数值发生了错误,最后发现是resize函数调用过程中参数调用出现错误,主要是参数顺序,记录之。问题分析源码 结果: 虽然使用最近邻插值,但是resize后和预想的数值不一致,多方分析、调试,最后小伙伴发现是调用函数参数不正确。opencv官......
  • Python+OpenCV系列:绘制图形和文字
    绘制图形和文字1.基本绘图函数简介2.绘制示例代码2.1创建一个空白图像2.2绘制基本图形1.绘制直线2.绘制矩形3.绘制圆4.绘制椭圆2.3添加文字3.显示与保存图像4.扩展应用总结在图像处理领域,绘制基本图形和文字是一个常见需求,例如标记对象、绘制边界框或添......