系列文章目录

一、环境配置:win10+VS2017+qt5+spinnaker+opencv+python
二、相机调用:VS2017+qt5调用FLIR工业相机实时成像
三、图像处理:C++调用pytorch模型实时处理相机图像

相机调用:VS2017+qt5调用FLIR工业相机实时成像

本文通过在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——程序入口函数

2.项目文件编辑

  1. 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();//退出程序

  1. FLIRVision.ui
  • 在窗口中添加了一个label用于图像显示,三个button分别用来开启相机、关闭相机、退出程序。

label修改属性objectName为img_orig,三个button修改属性objectName分别为start、stop、exit

在这里插入图片描述

  • button关联槽函数

点击下图按钮,编辑信号槽

在这里插入图片描述

点击start按钮,按住鼠标左键拖至空白处

在这里插入图片描述

出现如下界面,左侧选择操作,右侧选择对应执行的函数start()

在这里插入图片描述

若右侧无对应函数,点击上图右侧的编辑按钮,输入对应函数即可

在这里插入图片描述

依次完成三个button的槽函数关联

  1. 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();关闭当前界面
}

相机读取模式有以下几种
在这里插入图片描述

  1. 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();
}

——————————————————————————————
本文完。
运行结果将会在下一篇文章一起展示。
下一篇文章是将相机采集到的图像采用深度学习模型处理之后显示。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐