【FLIR工业相机】二、相机调用:VS2017+qt5调用FLIR工业相机实时成像
系列文章目录一、环境配置:win10+VS2017+qt5+spinnaker+opencv+python二、相机调用:VS2017+qt5调用FLIR工业相机实时成像三、图像处理:C++调用pytorch模型实时处理相机图像相机调用:VS2017+qt5调用FLIR工业相机实时成像系列文章目录1.新建项目2.项目文件编辑本文通过在VS2017中新建Qt项目,调用FLIR近红外工业相机,并在UI界
系列文章目录
一、环境配置:win10+VS2017+qt5+spinnaker+opencv+python
二、相机调用:VS2017+qt5调用FLIR工业相机实时成像
三、图像处理:C++调用pytorch模型实时处理相机图像
本文通过在VS2017中新建Qt项目,调用FLIR近红外工业相机,并在UI界面实时显示相机数据。
原理是编写一个图像更新函数采集图片数据,设置一个定时器,当定时器时间耗尽就执行图像更新程序更新图片。
1.新建项目
- 创建新项目-已安装-Visual C+±Qt-Qt Widgets Application-修改文件名称(FLIRVision)和位置-确定,即可完成项目的新建。
- 项目主要包含FLIRVision.h、FLIRVision.ui、FLIRVision.cpp、main.cpp四个文件。
FLIRVision.h——主窗体头文件,包含需要调用的库,以及自己创建的函数的声明
FLIRVision.ui——界面设计文件,双击可以打开Qt Creator进行界面编辑,退出之后要保存
FLIRVision.cpp——主窗体源文件,写入窗体的操作
main.cpp——程序入口函数
- 在完成新项目的创建之后,需要将环境设置为之前配置的环境( 一、环境配置:win10+VS2017+qt5+spinnaker+opencv+python),本项目设置的环境为Release x64.
2.项目文件编辑
- FLIRVision.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_FLIRVision1.h"
#include <Spinnaker.h>
#include <SpinGenApi/SpinnakerGenApi.h>
#include <iostream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <qlabel.h>
#include <qpainter.h>
#include <qtimer.h>
#include <qimage.h>
#include <qpixmap.h>
#include <qstring.h>
using namespace Spinnaker;
using namespace Spinnaker::GenApi;
using namespace Spinnaker::GenICam;
using namespace std;
using namespace cv;
class FLIRVision1 : public QMainWindow
{
Q_OBJECT
public:
FLIRVision1(QWidget *parent = Q_NULLPTR);
void RunSingleCamera(CameraPtr pCam);//运行单个相机
public slots:
void start();//开启相机
void stop();//关闭相机
void UpdateImages();//更新图像
void exit();//退出程序
private:
Ui::FLIRVision1Class ui;
Mat frame;
//调用相机所需的变量
SystemPtr system;//相机系统变量
CameraList camList;//相机列表变量
CameraPtr pCam = nullptr;//相机指针变量
//定时器
QTimer *updateTime = new QTimer(this);
};
*需要注意的是,以下四个函数需要写在类的public slots中,因为start()、stop()、exit()函数需要与窗口中的button关联,UpdateImages()需要与定时器关联。
void start();//开启相机
void stop();//关闭相机
void UpdateImages();//更新图像
void exit();//退出程序
- FLIRVision.ui
- 在窗口中添加了一个label用于图像显示,三个button分别用来开启相机、关闭相机、退出程序。
label修改属性objectName为img_orig,三个button修改属性objectName分别为start、stop、exit
- button关联槽函数
点击下图按钮,编辑信号槽
点击start按钮,按住鼠标左键拖至空白处
出现如下界面,左侧选择操作,右侧选择对应执行的函数start()
若右侧无对应函数,点击上图右侧的编辑按钮,输入对应函数即可
依次完成三个button的槽函数关联
- FLIRVision.cpp
#include "FLIRVision1.h"
FLIRVision1::FLIRVision1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(updateTime, SIGNAL(timeout()), this, SLOT(UpdateImages()));//关联定时器与图像更新函数
}
void FLIRVision1::start()//开启相机
{
system = System::GetInstance();//新建相机系统
camList = system->GetCameras();//获取相机列表
const unsigned int numCameras = camList.GetSize();//获取相机数目
cout << "Number of cameras detected: " << numCameras << endl << endl;
pCam = camList.GetByIndex(0);//相机实例化,由于只有一个相机,因此相机index为0
updateTime->start(1);//开启定时器
RunSingleCamera(pCam);//打开相机
ui.start->setDisabled(true);//start按钮停用
ui.stop->setDisabled(false);//stop按钮启用
}
void FLIRVision1::RunSingleCamera(CameraPtr pCam)//打开相机
{
try
{
pCam->Init();//相机初始化
pCam->BeginAcquisition();//开始采集图像
//设置相机内存缓存帧数,默认为10
INodeMap & sNodeMap = pCam->GetTLStreamNodeMap();
CIntegerPtr StreamNode = sNodeMap.GetNode("StreamDefaultBufferCount");
INT64 bufferCount = StreamNode->GetValue();
StreamNode->SetValue(5);
//设置相机数据读取模式
CEnumerationPtr ptrHandlingMode = sNodeMap.GetNode("StreamBufferHandlingMode");
CEnumEntryPtr ptrHandlingModeEntry = ptrHandlingMode->GetCurrentEntry();
ptrHandlingModeEntry = ptrHandlingMode->GetEntryByName("NewestOnly");
ptrHandlingMode->SetIntValue(ptrHandlingModeEntry->GetValue());
}
catch (Spinnaker::Exception& e)
{
cout << "Error: " << e.what() << endl;
}
}
void FLIRVision1::UpdateImages()
{
double scale = 0.15625;//图像缩放比例
ImagePtr pResultImage = pCam->GetNextImage();//创建图像指针并获取下一帧图像
const size_t width = pResultImage->GetWidth();//图像宽度
const size_t height = pResultImage->GetHeight();//图像高度
ImagePtr rgbImage = pResultImage->Convert(PixelFormat_BGR8);//图像格式转换
unsigned int rowBytes = (double)rgbImage->GetImageSize() / (double)height;
frame = Mat(height, width, CV_8UC3, rgbImage->GetData(), rowBytes);//将图像转换为Mat格式
cv::resize(frame, frame, Size(height*scale, width*scale));//改变图像尺寸
QImage img(frame.data, frame.cols, frame.rows, QImage::Format_RGB888);//创建Qt可以显示的图像格式
ui.img_orig->setPixmap(QPixmap::fromImage(img));//在img_orig label中显示图像
pResultImage->Release();//释放图像指针
}
void FLIRVision1::stop()//关闭相机
{
ui.img_orig->clear();//情况label
ui.start->setDisabled(true);//start启用
ui.stop->setDisabled(true);//stop停用
pCam->EndAcquisition();//停止采集图像
updateTime->stop();//定时器停止
pCam->DeInit();//相机卸载
pCam = nullptr;//清空相机指针
camList.Clear();//清空相机列表
system->ReleaseInstance();//释放相机系统
}
void FLIRVision1::exit()//退出界面
{
this->close();关闭当前界面
}
相机读取模式有以下几种
- main.cpp
该文件不用编辑。
#include "FLIRVision1.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FLIRVision1 w;
w.show();
return a.exec();
}
——————————————————————————————
本文完。
运行结果将会在下一篇文章一起展示。
下一篇文章是将相机采集到的图像采用深度学习模型处理之后显示。
更多推荐
所有评论(0)