Qt 实现遥感图像显示时的连动效果

时间:2022-09-06 15:49:52

遥感图像处理时少不了ENVI,用过ENVI的人都知道,打开图像时或图像处理完后,在缩略图上移动鼠标时,鼠标周围的图像信息会在大的视图中实时的显示,即大图会跟着小图中的鼠标移动,这即是图像的连动效果。如下图是ENVI的示意图:

Qt  实现遥感图像显示时的连动效果

在软件设计中,要实现类似ENVI中连动的效果,确实要费一番脑筋。

要求:有两幅图,一个是缩略图,一个是原图或处理后的图,使用两个对话框,鼠标在小的缩略图中移动或点击时,大图中的图像实时显示出鼠标所在位置的图像。

结果展示:首先给出结果展示,这样读者也好明白实现这样的功能入手点和重点在那些地方。

Qt  实现遥感图像显示时的连动效果

从上图中可以看出:1.大图在移动时其实只需要控制滑动杆的位置即可,控制滑动杆的位置即设置水平和垂直两个滑动轴的值大小;

2.需要检测出鼠标在缩略图中的滑动和点击事件

再联系到使用QT实现时,可以使用信号与槽将这两者联系起来,两幅图对应两个对话框,使用两个类分别实现对话框的功能。鼠标在缩略图中点击或移动时,实时记录鼠标所在位置,并触发信号,大图的槽函数响应缩略图对话框发过来的信号,设置滑动轴的值。

坐标值与滑动轴值之间的联系:需要确定鼠标在缩略图中的位置,x长度占缩略图宽度的百分比,y长度占缩略图长度的百分比,然后这两个值传递给大图对话框的类对象,根据这两个百分比和大图图像的宽和高设置滑动杆的值。

缩略图对话框类为SmallImage,大图对话框类为ImgShow

首先是在SmallImage类中重写鼠标事件,缩略图图像显示区大小固定为300*300

 //smallimage.h
#ifndef SMALLIMAGE_H
#define SMALLIMAGE_H #include <QWidget>
#include <QMouseEvent>
#include "ui_smallimage.h" class SmallImage : public QWidget
{
Q_OBJECT public:
SmallImage(QWidget *parent = );
~SmallImage(); void show_small_img(float *data,int width,int height);//显示缩略图图像 float x_value;//鼠标点所在位置占x轴的百分比
float y_value;//鼠标点所在位置占y轴的百分比 signals:
void press(float x,float y); private:
Ui::SmallImage ui; void mousePressEvent(QMouseEvent *ev);//重写鼠标按下事件
void mouseMoveEvent(QMouseEvent *ev);//重写鼠标移动事件 int img_width_;//缩略图宽
int img_height_;//缩略图高 }; #endif // SMALLIMAGE_H //smallimage.cpp
//重写鼠标按下事件
void SmallImage::mousePressEvent(QMouseEvent *ev)
{
int x1=ui.label->x();//x坐标
int y1=ui.label->y();//y坐标
int x_left=x1+(-img_width_)/;//缩略图左起x坐标
int x_right=x1+img_width_+(-img_width_)/;//缩略图右边的x坐标
int y_top=y1+(-img_height_)/;//缩略图上起y坐标
int y_bottom=y1+img_height_+(-img_height_)/;//缩略图底部y坐标
int x0=ev->x();
int y0=ev->y();
if ( (x0>=x_left) && (x0<=x_right) && (y0>=y_top) && (y0<=y_bottom))
{
x_value=(float)(x0-x_left)/(float)img_width_;
y_value=(float)(y0-y_top)/(float)img_height_;
//触发鼠标按下信号
emit press(x_value,y_value);
}
} //鼠标移动操作
void SmallImage::mouseMoveEvent(QMouseEvent *ev)
{
int x1=ui.label->x();//x坐标
int y1=ui.label->y();//y坐标
int x_left=x1+(-img_width_)/;//缩略图左起x坐标
int x_right=x1+img_width_+(-img_width_)/;//缩略图右边的x坐标
int y_top=y1+(-img_height_)/;//缩略图上起y坐标
int y_bottom=y1+img_height_+(-img_height_)/;//缩略图底部y坐标
int x0=ev->x();
int y0=ev->y();
if ( (x0>=x_left) && (x0<=x_right) && (y0>=y_top) && (y0<=y_bottom))
{
x_value=(float)(x0-x_left)/(float)img_width_;
y_value=(float)(y0-y_top)/(float)img_height_;
emit press(x_value,y_value);
}
}

然后是在ImgShow类中定义槽函数

 //imgshow.h
public slots:
void set_scroll_value(float x0,float y0);//设置滑动杆的值 //imgshow.cpp
//设置滑动杆的值
void ImgShow::set_scroll_value(float x0, float y0)
{
ui.scrollArea->horizontalScrollBar()->setValue(x0*img_width_- (ui.scrollArea->width())/);
ui.scrollArea->verticalScrollBar()->setValue(y0*img_height_- (ui.scrollArea->height())/);
}

最后是当着两个对话框均显示出来之后将他们的信号与槽连接起来。

connect(small_img,SIGNAL(press(float,float)),img_show,SLOT(set_scroll_value(float,float)))

还有相当重要的一点就是,两个对话框必须都是非模态,关于非模态的内容请见:http://blog.csdn.net/luo_klt/article/details/8826975

本文中忽略了图像读取及显示等操作,在本人博客中的其他文章中有详细叙述,详见:

http://www.cnblogs.com/Romi/archive/2012/03/14/2396627.html

http://www.cnblogs.com/Romi/archive/2012/03/14/2396533.html

http://www.cnblogs.com/Romi/archive/2012/03/29/2424073.html

最后说一下,此文论述的方法是通过移动滑动杆(即改变滑动杆的值)来实现图像连动的,该文中的大图是显示的全部图像而非区域图像。

当只需要对区域进行处理而非全部图像时,这时上述方法便不起作用了,这时有一个简单的方法是固定选取鼠标在缩略图中周围的一小块数据,将它全部处理然后显示在大图上,每当鼠标移动或点击时都进行选取区域处理然后显示的执行过程。因为固定选取的是一小块区域因此处理起来速度也快。

倘若不是上面说的两种情况而是选取一块感兴趣区域时,这时就更加麻烦了,但回头一想,选择感兴趣区域区域大还好区域小的话,连动还有什么意义呢,况且选择的都不会是大的区域。有一个办法是先把选择的区域通过第三方软件截下来,然后使用文中的方法对截下来保存的图像数据进行处理并显示。

Qt 实现遥感图像显示时的连动效果的更多相关文章

  1. 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果

    1.颜色小tip知识 在背景色上方叠加一个黑色半透明层 rgba(0,0,0,.2) 可以得到一个更暗的颜色 在背景色上方叠加一个白色半透明层 rgba(255,255,255,.2) 可以得到一个更 ...

  2. js简单实现删除记录时的提示效果

    删除记录时的提示效果,挺人性化的,实现的方法有很多,在本文为大家介绍下使用js是如何实现的 样式 复制代码代码如下: <style type="text/css">  ...

  3. 设置Activity显示和关闭时的动画效果

    设置Activity显示和关闭时的动画效果 通过overridePendingTransition方法可以设置Activity显示和关闭的动画效果.首先需要在res/anim目录中建立相应的动画资源文 ...

  4. ScrollReveal&period;js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力。

    ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力. 1.http://www.yangqq.com/jstt/css3/2017-08-08/787. ...

  5. Ubuntu16&period;04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE&lowbar;CC &plus;&equals; -g)

    记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...

  6. Qt for android运行时出错 Error&colon; Target id &&num;39&semi;android--1&&num;39&semi; is not valid

    [提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题   离线yijun ...

  7. VUE - 路由跳转时设置动画效果

    /* 为对应的路由跳转时设置动画效果 */   <transition name="fade">         <router-view />     & ...

  8. CSS实现页面切换时的滑动效果

    最近在开发手机端APP页面功能时遇到一个需求:某个页面查询的数据有三种分类,需要展示在同一页面上,用户通过点击分类标签来查看不同类型的数据, 期望效果是 用户点击标签切换时另一个页面能够以一个平滑切入 ...

  9. 基于Qt的遥感图像处理软件设计总结

     开发工具 VS2008+Qt4.8.0+GDAL1.9  要点 接口要独立,软件平台与算法模块独立,平台中各接口设计灵活,修改时容易. 设计软件时一步步来,每个功能逐一实现,某个功能当比较独立时可以 ...

随机推荐

  1. 51nod1089&lpar;最长回文子串之manacher算法&rpar;

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  2. Theano2&period;1&period;6-基础知识之在thenao中的求导

    来自:http://deeplearning.net/software/theano/tutorial/gradients.html Derivatives in Theano 一.计算梯度 现在,让 ...

  3. 如何绑定android点击事件--跳转到另一个页面并实现关闭功能?

    一.点击按钮跳转到另一个页面. eg:实现从一个页面点击跳转到另一个页面 1.首先在一个布局文件(.XML)中绘画了一个跳转按钮(id为btn1): <Button         androi ...

  4. JS--中的 Cookie 与存储

    Cookie 主要是在客户端进行一些简单的数据存储等,使用来提供本地化存储的脚本功能.Cookie 的处理环境本身是需要在服务器下进行的,但是现在的大部分浏览器都已经支持Cookie本地化的存储于处理 ...

  5. 1050 Moving Tables

    Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. java实现的一个maven多模块项目自动生成工具

    平时在做spring mvc web新项目时,都需要自己去搭建spring mvc的项目框架,包括基本pom 依赖引入,基本配置文件(web.xml,spring-mvc.xml,数据库配置文件等等) ...

  7. 寻找序列中最小的第N个元素(partition函数实现)

    Partition为分割算法,用于将一个序列a[n]分为三部分:a[n]中大于某一元素x的部分,等于x的部分和小于x的部分. Partition程序如下: long Partition (long a ...

  8. android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)

    Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...

  9. pypi 的使用

    关于本人的package,情况比较简单,所有的.py文件全部放到了一个叫做FundsData的文件夹下(package下),上层目录也叫FundsData(其实叫什么都可以),其下放了setup.py ...

  10. 神州数码OSPF基于区域认证(简单、MD5认证)

    实验要求:掌握基于区域的简单认证及MD5认证 拓扑如下 简单认证 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface l0 进入端口 i ...