惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
Blog — PlanetScale
Blog — PlanetScale
B
Blog
GbyAI
GbyAI
爱范儿
爱范儿
月光博客
月光博客
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
腾讯CDC
MyScale Blog
MyScale Blog
V
Visual Studio Blog
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 上位机

wkhtmltopdf chart.js 浏览器打开html是正常的,输出pdf时,图表时无法显示问题 opencv 4.x 静态编译后 录像视频保存为h264 vtkImageData的GetScalarPointer参数范围和SetExtent的范围相关 Qt 5 QFormLayout 隐藏一行 或 重新布局 Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题 std的map或者set中,比较浮点类型二维三维数据 Qt 子窗口 隐藏标题栏的图标,在任务栏上的不显示 windbg 调试 c++ std::exception VS C++ 出现debug assertion failed弹框,怎么定位代码 QTabWidget的高度取决于当前选项卡的高度 Qt tr 无法翻译 Qt 窗口随控件变换大小 vtkCellLocator IntersectWithLine 返回不是最近的交点 设置QToolBar的Action图标之间的间隔 Visual Studio 2017 rc 资源文件 预处理 宏 无效 Qt No Target Architecture vtkDelaunay2D 错误 Edge not recovered, polygon fill suspect VTK vtkAssembly 拾取 Qt 在线程中invokeMethod采用QueuedConnection模式,调用带指针参数槽,实际不会调用
opencv imshow 大图片显示,拖动显示
上位机 · 2024-12-13 · via 博客园 - 上位机
用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 onMouse(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, onMouse, mp); // whole display image
    
    cv::imshow(winname, mp->m_Roi);
}

用MatShow替换imshow