在前面的项目上进行修改,增加了图片保存功能
需要实现的主要功能:1.读取指定的图像 2. 读取连接的相机图像 3.图像的保存
项目环境: win10 HALCON18.11 Qt 514
项目文件(.pro)
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#halcon配置代码,已经将include、lib拷贝到项目之下
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhalcon
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhalconc
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhalconcpp
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhalconcppxl
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhalconcxl
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhalconxl
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhdevenginecpp
win32: LIBS += -L$$PWD/lib/x64-win64/ -lhdevenginecppxl
win32: LIBS += -L$$PWD/lib/x64-win64/ -llibiomp5md
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include头文件Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QTabWidget>
#include <QGroupBox>
#include <QRadioButton>
#include <QVBoxLayout>
#include <QCheckBox>
#include <QDebug>
#include <QMouseEvent>
#include <QPainter>
#include <QLineEdit>
#include <QTextEdit>
#include<QFileDialog>
#include<QCoreApplication>
#include <QTimer>
#include <QPalette>
#include <QWidget>
#include <QMessageBox>
#include <QTabWidget>
#include <QGroupBox>
#include <QRadioButton>
#include <QVBoxLayout>
#include <QCheckBox>
#include <QDebug>
#include <QMouseEvent>
#include <QPainter>
#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QMouseEvent>
#include "halconcpp/HalconCpp.h"
#include "Halcon.h"
using namespace HalconCpp;
#pragma execution_character_set("utf-8") //支持中文
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
QLabel *label;
QPushButton *btn1;
QPushButton *btn2;
QPushButton *btn3;
QPushButton *btn4;
HTuple hv_AcqHandle,hv_WindowHandle;
HObject ho_Image;
HTuple hv_Width, hv_Height;
Hlong windID;
QTimer *timer;
Hlong MainWndID;
QTabWidget *tabwidget;
QWidget *tab1;
QWidget *tab2;
QTextEdit *qle;
QComboBox *cbox;
HTuple hv_Information, hv_ValueList;
QMenu *m_pMenu;
QAction *m_pa1,*m_pa2;
void createWidget();
void createMyMenu();
private slots:
void on_clicked1();
void on_clicked2();
void on_clicked3();
void on_clicked4();
void camera();
void onMenu1Event();
void onMenu2Event();
protected:
void mousePressEvent(QMouseEvent * event);//鼠标单击事件
};
#endif // WIDGET_HC++文件Widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//创建界面
createWidget();
//创建快捷菜单
createMyMenu();
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(camera()));
connect(this->btn1,SIGNAL(clicked()),this,SLOT(on_clicked1()));
connect(this->btn2,SIGNAL(clicked()),this,SLOT(on_clicked2()));
connect(this->btn3,SIGNAL(clicked()),this,SLOT(on_clicked3()));
connect(this->btn4,SIGNAL(clicked()),this,SLOT(on_clicked4()));
connect(m_pa1,SIGNAL(triggered()),this,SLOT(onMenu1Event()));
connect(m_pa2,SIGNAL(triggered()),this,SLOT(onMenu2Event()));
}
Widget::~Widget()
{
}
void Widget::createWidget(){
this->setFixedSize(1000,575);
this->setWindowTitle("图像读取");
label = new QLabel(this);
label->setGeometry(350,25,600,500);
MainWndID = (Hlong)this->label->winId();
OpenWindow(0, 0, label->width(), label->height(), MainWndID,
"visible", "", &hv_WindowHandle);
HDevWindowStack::Push(hv_WindowHandle);
qle = new QTextEdit(this);
//qle->setGeometry(25,325,300,200);
qle->setGeometry(25,330,300,195);
qle->setReadOnly(true);
tabwidget = new QTabWidget(this);
tab1 = new QWidget;
tab2 = new QWidget;
//tab3 = new QWidget;
tabwidget->addTab(tab1, "读取指定图像");
tabwidget->addTab(tab2, "读取相机图像");
tabwidget->setGeometry(25, 25, 300, 300);
tabwidget->setTabShape(QTabWidget::Triangular);
QVBoxLayout *vbox1 = new QVBoxLayout;
//vbox1->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
vbox1->setAlignment(Qt::AlignCenter);
tab1->setLayout(vbox1);
btn1 = new QPushButton();
btn1->setFixedSize(100,50);
btn1->setText("选择图片");
vbox1->addWidget(btn1);
QVBoxLayout *vbox2 = new QVBoxLayout;
//vbox2->setSpacing(20);
//vbox2->addStretch();
//vbox2->setContentsMargins(0,9,0,9);
//vbox2->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
//vbox2->setAlignment(Qt::AlignVCenter);
vbox2->setAlignment(Qt::AlignHCenter);
//vbox2->setAlignment(Qt::AlignJustify);
//vbox2->addSpacing(10);
//vbox2->setSpacing(20);
tab2->setLayout(vbox2);
btn2 = new QPushButton();
btn2->setFixedSize(100,50);
btn2->setText("打开相机");
btn2->setEnabled(false);
btn3 = new QPushButton();
btn3->setFixedSize(100,50);
btn3->setText("关闭相机");
btn3->setEnabled(false);
QVBoxLayout *vbox5 = new QVBoxLayout;
vbox5->addWidget(btn2);
vbox5->addWidget(btn3);
vbox5->setAlignment(Qt::AlignHCenter);
vbox5->setSpacing(20);
btn4 = new QPushButton();
btn4->setFixedSize(100,50);
btn4->setText("检测相机");
QVBoxLayout *vbox4 = new QVBoxLayout;
vbox4->addWidget(btn4);
vbox4->setAlignment(Qt::AlignHCenter);
QVBoxLayout *vbox3 = new QVBoxLayout;
cbox = new QComboBox();
//cbox->setFixedSize(200,30);
cbox->setFixedSize(200,35);
vbox3->addWidget(cbox);
vbox3->setAlignment(Qt::AlignHCenter);
//vbox2->addWidget(btn4);
QWidget *qw0 = new QWidget;
qw0->setLayout(vbox4);
vbox2->addWidget(qw0);
//vbox2->addStretch();
//vbox2->addWidget(cbox);
QWidget *qw1 = new QWidget;
qw1->setLayout(vbox3);
vbox2->addWidget(qw1);
//vbox2->addWidget(vbox3);
//vbox2->addWidget(btn2);
//vbox2->addWidget(btn3);
QWidget *qw2 = new QWidget;
qw2->setLayout(vbox5);
vbox2->addWidget(qw2);
//vbox2->addSpacing(50);
}
void Widget::createMyMenu(){
//创造菜单对象
m_pMenu = new QMenu(this);
m_pa1 = m_pMenu->addAction("另存为");
m_pa2 = m_pMenu->addAction("退出");
}
void Widget::mousePressEvent(QMouseEvent *event)
{
//在鼠标右击的地方显示菜单
/*
if(e->button()==Qt::RightButton)
{
m_pMenu->exec(cursor().pos());
}*/
if(label->geometry().contains(this->mapFromGlobal(QCursor::pos())) //鼠标是否在界面上
&&event->button()==Qt::RightButton)
{
qDebug() << "右键:快捷菜单" ;
m_pMenu->exec(cursor().pos());
}
}
void Widget::onMenu1Event(){
//QMessageBox::information(this,"注意","保存图片");
try
{
qDebug() << "另图片为";
QString filename = QFileDialog::getSaveFileName(this,tr("Save Image"),"",tr("Images (*.png *.bmp *.jpg)")); //选择路径
qDebug() << "图片路径:"<<filename;
//分割路径,获得路径文件名,文件格式
if(!(filename.isEmpty())) //文件路径不为空
{
QStringList strList = filename.split(".");
//QString type = strList[1];
//halcon的字符是Htuple格式需要转化,使用前需要转换下
QByteArray Qa1 = strList[0].toLatin1();
const char *str1 = Qa1.data();
HTuple ImageName(str1);
QByteArray Qa2 = strList[1].toLatin1();
const char *str2 = Qa2.data();
HTuple ImageType(str2);
//WriteImage(ho_Image, "jpg", 0, "C:/Users/admin/Desktop/1.jpg");
WriteImage(ho_Image, ImageType, 0, ImageName);
}
}
catch (HException &HDevExpDefaultException)
{
HTuple hv_Exception;
HDevExpDefaultException.ToHTuple(&hv_Exception);
qDebug() << "保存图片失败";
}
}
void Widget::onMenu2Event(){
//close();
//this->close();
qDebug() << "退出";
close();
}
void Widget::on_clicked1(){
qDebug() << "按下了1号按钮,读取图片";
try
{
QString file_name;
file_name = QFileDialog::getOpenFileName(this,tr("open file"),".",tr("Video Files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm)"));
qle->setText("读取图像:"+file_name);
QByteArray ba = file_name.toLatin1();
const char *str = ba.data();
HTuple ImageName(str);
ReadImage(&ho_Image, ImageName);
GetImageSize(ho_Image, &hv_Width, &hv_Height);
SetPart(hv_WindowHandle, 0, 0, hv_Height, hv_Width);
DispObj(ho_Image, HDevWindowStack::GetActive());
}
catch (HException &HDevExpDefaultException)
{
HTuple hv_Exception;
HDevExpDefaultException.ToHTuple(&hv_Exception);
}
}
void Widget::on_clicked2(){
qDebug() << "按下了2号按钮,打开相机";
qle->setText("打开相机");
timer->start(20);//定时器开始工作,参数影响帧率
//Image Acquisition 01: Code generated by Image Acquisition 01
/*
OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false",
"default", "[0] USB2.0 PC CAMERA", 0, -1, &hv_AcqHandle);*/
try
{
int curIndex = cbox->currentIndex();
OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false",
"default", hv_ValueList[curIndex], 0, -1, &hv_AcqHandle);
//SetFramegrabberParam(hv_AcqHandle, "brightness", 0);
//SetFramegrabberParam(hv_AcqHandle, "contrast", 28);
GrabImageStart(hv_AcqHandle, -1);
// 在openwindow前先抓取一帧图片
GrabImage(&ho_Image,hv_AcqHandle);
btn3->setEnabled(true);
btn2->setEnabled(false);
}
catch (HException &HDevExpDefaultException)
{
HTuple hv_Exception;
HDevExpDefaultException.ToHTuple(&hv_Exception);
}
}
void Widget::on_clicked3(){
qDebug() << "按下了3号按钮,关闭相机";
qle->setText("关闭相机");
timer->stop();
CloseFramegrabber(hv_AcqHandle);
btn3->setEnabled(false);
btn2->setEnabled(true);
}
void Widget::camera()
{
GrabImage(&ho_Image, hv_AcqHandle);
GetImageSize(ho_Image, &hv_Width, &hv_Height);
SetPart(hv_WindowHandle, 0, 0, hv_Height, hv_Width);
if(HDevWindowStack::IsOpen())
{
DispObj(ho_Image,HDevWindowStack::GetActive());
}
//WaitSeconds(0.1);
}
void Widget::on_clicked4(){
qDebug() << "按下了4号按钮,检测相机";
try
{
InfoFramegrabber("DirectShow", "device", &hv_Information, &hv_ValueList);
HString str1 = hv_Information.S();
int num = hv_ValueList.Length();
QString result = "检测到"+QString::number(num)+"个相机"+"\n"+str1.Text()+"\n";
// HString str2 = "";
cbox->clear();
for (int i = 0; i < num; ++i) {
HString str2 = hv_ValueList[i].S();
cbox->addItem(QString(str2));
result = result + str2.Text()+"\n";
}
qDebug()<<result;
qle->setText(result);
btn2->setEnabled(true);
}
catch (HException &HDevExpDefaultException)
{
HTuple hv_Exception;
HDevExpDefaultException.ToHTuple(&hv_Exception);
qle->setText("没检测到相机");
}
}编译运行


版权声明:本文为qq_16377055原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。