广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片
  • 308
分享到

VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

2024-04-02 19:04:59 308人浏览 八月长安
摘要

摘要 本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程。以及遇到的坑.....😑€

摘要

本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程。以及遇到的坑.....😑😑

先来看一下动态效果图:

主要控件:

  • 添加一个Label控件,对象名设为label,用于显示图片,并将背景设为黑色,设置方法为:选中Label控件,在属性编辑器中找到styleSheet属性,在其后的值中输入background-color:black即可;
  • 添加四个Push Button控件,如上图所示从左至右,对象名依次为:btn_prePic、btn_openPic、btn_nextPic,btn_resetPic,用于打开图片和前后浏览,以及恢复原图;
  • 添加一个Label,对象名设为label_status,用于实时显示坐标和灰度值;
  • 将label_show控件提升为CMyLabel类,用于接收鼠标事件。

代码例程

在Visual Studio中新建一个Qt GUI项目,名称设为BrowsePic,并新建Mylabel类(继承自QLabel)用于label控件的提升。

Mylabel.h


#pragma once
#include "qlabel.h"
#include"QWheelEvent"
#include<HalconCpp.h>
using namespace HalconCpp;

class Mylabel :
    public QLabel
{
    Q_OBJECT

public:
    Mylabel(QWidget* parent = Q_NULLPTR);
    ~Mylabel();
    //设置Halcon图像和Halcon窗口句柄,用户响应鼠标事件后实时更新图像
    void setHalconWnd(HObject img, HTuple hHalconID, QLabel* label);
    //鼠标滚轮缩放事件
    void wheelEvent(QWheelEvent* ev);
    //鼠标按下事件
    void mousePressEvent(QMouseEvent* ev);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent* ev);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent* ev);
public:
    HTuple m_labelID;            //Qt标签句柄
    HTuple m_hHalconID;            //Halcon窗口句柄
    HObject m_currentImg;        //当前的图像
    //主界面显示坐标的标签
    QLabel* m_label;
    //鼠标按下的位置 
    HTuple m_tMouseDownRow;
    HTuple m_tMouseDownCol;
    bool m_bIsMove;                //是否移动图像标识
};

Mylabel.cpp


#include "Mylabel.h"
//定义单步放大倍率
#define ZOOMRATIO 2.0

Mylabel::Mylabel(QWidget* parent)
    : QLabel(parent)
{
    m_bIsMove = false;
    this->setMouseTracking(true);
    
}
Mylabel::~Mylabel()
{

}

//设置Halcon图像和Halcon窗口句柄,用户响应鼠标事件后实时更新图像
void Mylabel::setHalconWnd(HObject img, HTuple hHalconID, QLabel* label)
{
    m_hHalconID = hHalconID;
    m_currentImg = img;
    m_label = label;
}

//鼠标滚轮缩放事件,用于缩放图像
void Mylabel::wheelEvent(QWheelEvent* ev)
{
    double Zoom;   //放大或缩小倍率
    HTuple  mouseRow, mouseCol, Button;
    HTuple startRowBf, startColBf, endRowBf, endColBf, Ht, Wt, startRowAft, startColAft, endRowAft, endColAft;
    //滚轮前滑,放大
    if (ev->delta()>0)
    {
        Zoom = ZOOMRATIO;
    }
    else//否则缩小
    {
        Zoom = 1 / ZOOMRATIO;
    }
    //获取光标在原图上的位置,注意是原图坐标,不是Label下的坐标
    HTuple  hv_Exception, hv_ErrMsg;
     try
     {
         GetMposition(m_hHalconID, &mouseRow, &mouseCol, &Button);

     }
     catch (HException& HDevExpDefaultException)
     {
         return;
     }
     //获取原图显示的部分,注意也是原图坐标
     GetPart(m_hHalconID, &startRowBf, &startColBf, &endRowBf, &endColBf);
     //缩放前显示的图像宽高
     Ht = endRowBf - startRowBf;
     Wt = endColBf - startColBf;
     //普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
     if (Ht*Wt<20000*20000||Zoom==ZOOMRATIO)
     {
         //计算缩放后的图像区域
         startRowAft = mouseRow - ((mouseRow - startRowBf) / Zoom);
         startColAft = mouseCol - ((mouseCol - startColBf) / Zoom);
         endRowAft = startRowAft + (Ht / Zoom);
         endColAft = startColAft + (Wt / Zoom);
         //如果放大过大,则返回
         if (endRowAft - startRowAft < 2)
         {
             return;
         }

         if (m_hHalconID != NULL)
         {
             //如果有图像,则先清空图像
             DetachBackgroundFromWindow(m_hHalconID);
         }
         SetPart(m_hHalconID, startRowAft, startColAft, endRowAft, endColAft);
         AttachBackgroundToWindow(m_currentImg, m_hHalconID);    
     }
}

void Mylabel::mousePressEvent(QMouseEvent* ev)
{
    HTuple mouseRow, mouseCol, Button;
    try
    {
        GetMposition(m_hHalconID, &mouseRow, &mouseCol, &Button);

    }
    catch (HException)
    {
        return;
    }
    //鼠标按下时的行列坐标
    m_tMouseDownRow = mouseRow;
    m_tMouseDownCol = mouseCol;
    m_bIsMove = true;
}
//鼠标释放事件
void Mylabel::mouseReleaseEvent(QMouseEvent* ev)
{
    m_bIsMove = false;
}
//鼠标移动事件
void Mylabel::mouseMoveEvent(QMouseEvent* ev)
{
    HTuple startRowBf, startColBf, endRowBf, endColBf, mouseRow, mouseCol, Button;
    try
    {
        GetMposition(m_hHalconID, &mouseRow, &mouseCol, &Button);

    }
    catch (HException)
    {
        return;
    }
    //鼠标按下并移动时,移动图像,否则只显示坐标
    if (m_bIsMove)
    {
        //计算移动值
        double RowMove = mouseRow[0].D() - m_tMouseDownRow[0].D();
        double ColMove = mouseCol[0].D() - m_tMouseDownCol[0].D();
        //得到当前的窗口坐标
        GetPart(m_hHalconID, &startRowBf, &startColBf, &endRowBf, &endColBf);
        //移动图像
        if (m_hHalconID!=NULL)
        {
            //如果有图像,则先清空图像
            DetachBackgroundFromWindow(m_hHalconID);
        }
        SetPart(m_hHalconID, startRowBf - RowMove, startColBf - ColMove, endRowBf - RowMove, endColBf - ColMove);
        AttachBackgroundToWindow(m_currentImg, m_hHalconID);
    }
    //获取灰度值
    HTuple pointGray;
    try
    {
        GetGrayval(m_currentImg, mouseRow, mouseCol, &pointGray);
    }
    catch (HException)
    {
        m_label->setText(QString::fromLocal8Bit("X坐标:-    Y坐标:-    灰度值:-"));

        return;
    }
    //设置坐标
    m_label->setText(QString::fromLocal8Bit("X坐标:%1    Y坐标:%2    灰度值:%3").arg(mouseCol[0].D()).arg(mouseRow[0].D()).arg(pointGray[0].D()));
}

BrowsePic.h


#pragma once

#include <QtWidgets/QWidget>
#include "ui_BrowsePic.h"
#include<HalconCpp.h>
#include"qtoolbar.h"
using namespace HalconCpp;
#pragma execution_character_set("utf-8");

class BrowsePic : public QWidget
{
    Q_OBJECT

public:
    BrowsePic(QWidget *parent = Q_NULLPTR);
    ~BrowsePic();
    //初始化
    void init();

    //显示图像
    void showImg();
    int currentIndex;
    //显示图像的控件id
    HTuple m_hLabelID;            //QLabel控件句柄
    HTuple m_hHalconID;            //Halcon显示窗口句柄

    //原始图像的尺寸
    HTuple m_imgWidth, m_imgHeight;

    //图片路径列表
    HTuple m_imgFiles;

    //当前图像
    HObject m_hCurrentImg;
    //缩放后的图像
    HObject m_hResizedImg;
    //缩放系数
    HTuple m_hvScaledRate;
    //缩放后图像的大小
    HTuple m_scaledHeight, m_scaledWidth;
    QToolBar* m_toolBar;
public slots:

    //打开图片
    void on_btn_openPic_clicked();

    //浏览前一张
    void on_btn_prePic_clicked();

    //浏览后一张
    void on_btn_nextPic_clicked();

    //恢复图片
    void on_btn_resetPic_clicked();
private:
    Ui::BrowsePicClass ui;
};

BrowsePic.cpp


#include "browsepic.h"
#include"Mylabel.h"
#include <QFileDialog>
#include <QFileInfo>
BrowsePic::BrowsePic(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    init();

}
BrowsePic::~BrowsePic()
{

}

void BrowsePic::init()
{
    //设置halcon的文件路径为utf8,解决中文乱码
    SetSystem("filename_encoding", "utf8");
    //生成空图像
    GenEmptyObj(&m_hCurrentImg);
    m_hHalconID = NULL;
    m_hLabelID = (Hlong)ui.label->winId();
    currentIndex = -1;
}
//显示图像
void BrowsePic::showImg()
{
    if (m_hHalconID!=NULL)
    {
        //如果有图像,则先清空图像
        DetachBackgroundFromWindow(m_hHalconID);
        
    }
    else
    {
        //打开窗口
        OpenWindow(0, 0, ui.label->width(), ui.label->height(), m_hLabelID, "visible", "", &m_hHalconID);
    }
    ui.label-> setHalconWnd(m_hCurrentImg, m_hHalconID, ui.label_status);

    //获取图像大小
    GetImageSize(m_hCurrentImg, &m_imgWidth, &m_imgHeight);
    //获取缩放系数
    TupleMin2(1.0 * ui.label->width() / m_imgWidth, 1.0 * ui.label->height() / m_imgHeight, &m_hvScaledRate);
    //缩放图像
    ZoomImageFactor(m_hCurrentImg, &m_hResizedImg, m_hvScaledRate, m_hvScaledRate, "constant");
    //获取缩放后的大小
    GetImageSize(m_hResizedImg, &m_scaledWidth, &m_scaledHeight);
    //打开窗口
    if (1.0 * ui.label->width() / m_imgWidth < 1.0 * ui.label->height() / m_imgHeight)
    {
        SetWindowExtents(m_hHalconID, ui.label->height() / 2.0 - m_scaledHeight / 2.0, 0, ui.label->width(), m_scaledHeight);
    }
    else
    {
        SetWindowExtents(m_hHalconID, 0, ui.label->width() / 2.0 - m_scaledWidth / 2.0, m_scaledWidth, ui.label->height());

    }
    SetPart(m_hHalconID, 0, 0, m_imgHeight - 1, m_imgWidth - 1);
    AttachBackgroundToWindow(m_hCurrentImg, m_hHalconID);
}

//打开图片
void BrowsePic::on_btn_openPic_clicked()
{
    QString path = QFileDialog::getOpenFileName(this, "加载图像", "./", "图像文件(*.bmp *.png *.jpg)");
    QFileInfo fileInfo(path);
    QString dir = fileInfo.path();

    if (!path.isEmpty())
    {
        ListFiles(dir.toStdString().c_str(), "files", &m_imgFiles);

        TupleRegexpSelect(m_imgFiles, HTuple("\\.bmp|png|jpg").Append("ignore_case"), &m_imgFiles);


        for (int i = 0; i < m_imgFiles.Length(); i++)
        {

            QString currentPath = m_imgFiles[i];
            currentPath.replace("\\", "/");

            if (currentPath == path)
            {
                currentIndex = i;
                ReadImage(&m_hCurrentImg, m_imgFiles[i]);
                showImg();
            }

        }
    }

}

//浏览前一张
void BrowsePic::on_btn_prePic_clicked()
{
    if (currentIndex > 0)
    {
        currentIndex--;
        ReadImage(&m_hCurrentImg, m_imgFiles[currentIndex]);
        showImg();

    }
}
//浏览后一张
void BrowsePic::on_btn_nextPic_clicked()
{
    if (currentIndex >= 0 && currentIndex < m_imgFiles.Length() - 1)
    {
        currentIndex++;
        ReadImage(&m_hCurrentImg, m_imgFiles[currentIndex]);
        showImg();
    }
}
//恢复图片
void BrowsePic::on_btn_resetPic_clicked()
{
    showImg();
}

关键代码解释

Qt函数与Halcon算子获取的文件路径字符串的区别

Halcon算子获取的文件路径格式

list_files()的原型如下:

第一个参数为路径,提取的文件路径格式与参数Directory的形式有关,在HDevelop中测试

–Directory以"\\"分隔时,即list_files ('E:\\TEST', 'files', Files)

–Directory以“/”分隔时,即list_files ('E:/TEST', 'files', Files)

可以发现两种方式提取的文件路径字符串的区别。

Qt函数获取的文件路径格式

getOpenFileName()获得的路径:

如何将二者路径保持一致?

先读取halcon算子获取的路径:


 QString currentPath = m_imgFiles[i];

然后将" \ "全部换成" /":


 currentPath.replace("\\", "/");

2️⃣在VS中使用Halcon时的编码及中文乱码问题

默认条件下,可使用以下c++语句获取Halcon的文件名编码:


HTuple codeType;
get_system("filename_encoding", &codeType);
QString strCodeType = codeType[0].S();

可以发现默认的编码是locale,此时用Halcon算子list_files获取的文件路径中如果包含中文,则会出现乱码

解决方法:将Halcon的文件名编码格式设置为utf8,代码如下:


set_system("filename_encoding", "utf8");

参考链接:

(4条消息) VS+Qt应用开发-使用Halcon算子实现从文件夹打开图片、前后浏览、缩放居中显示_羽士的博客-CSDN博客

到此这篇关于VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片的文章就介绍到这了,更多相关VS+Qt+Halcon鼠标缩放、移动图片内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

本文链接: https://www.lsjlt.com/news/133605.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片
    摘要 本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程。以及遇到的坑.....😑€...
    99+
    2022-11-12
  • Pygame鼠标进行图片的移动与缩放怎么实现
    本篇内容主要讲解“Pygame鼠标进行图片的移动与缩放怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pygame鼠标进行图片的移动与缩放怎么实现”吧!# -*- co...
    99+
    2023-06-22
  • Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能
    这篇文章主要讲解了“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”吧!效果:实现思路在j...
    99+
    2023-07-05
  • Vue 图片监听鼠标滑轮滚动实现图片缩小放大功能(实现思路)
    目录前言效果:实现思路全页面代码:相关知识点分享前言 其实想要实现功能很简单,就是在一张图片上监听鼠标滑轮滚动的事件,然后根据上滚还是下滚实现图片的缩放。 效果: 注:该配图使用《...
    99+
    2023-05-13
    vue图片缩小放大 vue鼠标滑轮滚动
  • Pygame鼠标进行图片的移动与缩放案例详解
    pygame鼠标进行拖拽移动图片、缩放、以及按钮响应 案例 # -*- coding: UTF-8 -*- #!/usr/bin/env python3 # @Time :...
    99+
    2022-11-12
  • js实现鼠标移入图片放大效果
    使用原生js编写一个鼠标移入图片放大效果,供大家参考,具体内容如下 目标 给图片添加鼠标移动放大方法效果,移到哪里放大哪里 先看看效果是不是你想要的,再看代码 移入前 移入后 h...
    99+
    2022-11-13
  • jQuery怎么实现鼠标滚轮控制图片缩放
    本文小编为大家详细介绍“jQuery怎么实现鼠标滚轮控制图片缩放”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery怎么实现鼠标滚轮控制图片缩放”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2022-10-19
  • jQuery鼠标移动图片上实现放大效果的示例分析
    小编给大家分享一下jQuery鼠标移动图片上实现放大效果的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先界面上要有图...
    99+
    2022-10-19
  • javascript实现跟随鼠标移动的图片
    本文实例为大家分享了javascript实现图片跟随鼠标移动的具体代码,供大家参考,具体内容如下 实现思路 1、给 document 绑定 mousemove 事件,获取鼠标的坐标:...
    99+
    2022-11-12
  • Android手势控制实现缩放、移动图片
    本文实例为大家分享了Android手势控制实现缩放、移动图片的方法,供大家参考,具体内容如下 新建一个触摸监听器类 package com.liyong.btprinter;...
    99+
    2022-06-06
    图片 Android
  • js如何实现图片跟随鼠标移动
    这篇文章主要介绍“js如何实现图片跟随鼠标移动”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js如何实现图片跟随鼠标移动”文章能帮助大家解决问题。这里列举了两种实现...
    99+
    2022-10-19
  • jQuery如何实现鼠标滚轮控制图片缩放功能
    这篇文章主要为大家展示了“jQuery如何实现鼠标滚轮控制图片缩放功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现鼠标滚轮控制图片缩放功能...
    99+
    2022-10-19
  • CSS3如何实现鼠标移入图片动态提示效果
    这篇文章将为大家详细讲解有关CSS3如何实现鼠标移入图片动态提示效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言1. transform是什么?transfor...
    99+
    2022-10-19
  • CSS如何实现鼠标移至图片上显示遮罩层效果
    这篇文章主要介绍了CSS如何实现鼠标移至图片上显示遮罩层效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。将遮罩层html代码与图片放在一个div我是放在 .img_div里...
    99+
    2023-06-08
  • CSS中怎么实现鼠标移动切换图片
    本篇文章为大家展示了CSS中怎么实现鼠标移动切换图片,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!DOCTYPE html PUBLI...
    99+
    2022-10-19
  • 纯CSS怎么实现鼠标悬停显示图片效果
    这篇文章给大家分享的是有关纯CSS怎么实现鼠标悬停显示图片效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近在做一个网盘的项目,用到了鼠标移上去效果,这个效果可以用js来实现...
    99+
    2022-10-19
  • css如何实现鼠标点击后显示图片效果
    这篇文章主要讲解了“css如何实现鼠标点击后显示图片效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css如何实现鼠标点击后显示图片效果”吧! ...
    99+
    2022-10-19
  • CSS3实现感应鼠标的背景闪烁和图片缩放动画效果
    这篇文章主要介绍“CSS3实现感应鼠标的背景闪烁和图片缩放动画效果”,在日常操作中,相信很多人在CSS3实现感应鼠标的背景闪烁和图片缩放动画效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-19
  • dreamweaver如何实现鼠标放在不同的位置显示不同的图片
    这篇文章将为大家详细讲解有关dreamweaver如何实现鼠标放在不同的位置显示不同的图片,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先用ps或者其他软件将几张图片的大小p成一样的。比如笔者把三张图片...
    99+
    2023-06-08
  • css3怎么实现鼠标经过图片显示描述的动画效果
    本篇内容主要讲解“css3怎么实现鼠标经过图片显示描述的动画效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3怎么实现鼠标经过图片显示描述的动画效果”吧...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作