系列文章目錄
一、環境配置:win10+VS2017+qt5+spinnaker+opencv+python
二、相機呼叫:VS2017+qt5呼叫FLIR工業相機實時成像
三、影像處理:C++呼叫pytorch模型實時處理相機影像
相機呼叫:VS2017+qt5呼叫FLIR工業相機實時成像
- 系列文章目錄
- 1.新建專案
- 2.專案檔案編輯
本文通過在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();
}
——————————————————————————————
本文完,
運行結果將會在下一篇文章一起展示,
下一篇文章是將相機采集到的影像采用深度學習模型處理之后顯示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147910.html
標籤:python
上一篇:BP 神經網路用于模式分類
下一篇:網路經濟與企業管理自考學習

