简介
由于公司采购的AVT相机不足,需要用Basler相机来弥补,所以我也了解了一下Basler这款相机的SDK。由于Basler这边的相机提供的没有提供Qt的示例,所以我做一个分享出来。
本篇的Demo采用的是工业黑白相机。工业应用中,如果我们要处理的是与图像颜色有关,那么我们最好采用彩色工业相机;如果不是,那么我们最好选用黑白工业相机,因为在同样分辨率下的工业相机,黑白工业教学精度比彩色工业相机高,尤其是在看图像边缘的时候,黑白工业相机的效果更好。
开发环境
Qt: 5.6.2vc2013版
Basler: 5.0.11版
效果图
上图只是做了SDK部分接口的获取和设置。相机的触发方式、曝光时间、增益、频率,以及图片的尺寸、灯的触发信号等。
Basler相机SDK接口调用控制类
#ifndef SBASLERCAMERACONTROL_H
#define SBASLERCAMERACONTROL_H
#include
#include
#include
#include
#define DOUBLE_MAX 100000
#define DOUBLE_MIN 0
using namespace std;
using namespace Pylon;
using namespace GenApi;
class SBaslerCameraControl : public QObject
{
Q_OBJECT
public:
explicit SBaslerCameraControl(QObject *parent = 0);
~SBaslerCameraControl();
enum SBaslerCameraControl_Type{
Type_Basler_Freerun, //设置相机的内触发
Type_Basler_Line1, //设置相机的外触发
Type_Basler_ExposureTimeAbs, //设置相机的曝光时间
Type_Basler_GainRaw, //设置相机的增益
Type_Basler_AcquisitionFrameRateAbs, //设置相机的频率
Type_Basler_Width, //图片的宽度
Type_Basler_Height, //图片的高度
Type_Basler_LineSource, //灯的触发信号
};
void initSome();
void deleteAll();
QStringList cameras();
int OpenCamera(QString cameraSN);
int CloseCamera();
void setExposureTime(double time); // 设置曝光时间
int getExposureTime(); // 获取曝光时间
int getExposureTimeMin(); // 最小曝光时间
int getExposureTimeMax(); // 最大曝光时间
void setFeatureTriggerSourceType(QString type); // 设置种类
QString getFeatureTriggerSourceType(); // 获取种类:软触发、外触发等等
void setFeatureTriggerModeType(bool on); // 设置模式触发
bool getFeatureTriggerModeType(); // 获取模式触发
void SetCamera(SBaslerCameraControl::SBaslerCameraControl_Type index, double tmpValue = 0.0); // 设置各种参数
double GetCamera(SBaslerCameraControl::SBaslerCameraControl_Type index); // 获取各种参数
long GrabImage(QImage& image,int timeout = 2000);
long StartAcquire(); // 开始采集
long StopAcquire(); // 结束采集
signals:
void sigCameraUpdate(QStringList list);
void sigSizeChange(QSize size);
void sigCameraCount(int count);
void sigCurrentImage(QImage img);
private:
void UpdateCameraList();
void CopyToImage(CGrabResultPtr pInBuffer, QImage &OutImage);
private slots:
void onTimerGrabImage();
private:
CInstantCamera m_basler;
QStringList m_cameralist;
QString m_currentMode;
bool m_isOpenAcquire = false; // 是否开始采集
bool m_isOpen = false; // 是否打开摄像头
QSize m_size;
};
#endif // SBASLERCAMERACONTROL_H
源文件:
#include "sbaslercameracontrol.h"
#include
#include
SBaslerCameraControl::SBaslerCameraControl(QObject *parent) : QObject(parent)
{
}
SBaslerCameraControl::~SBaslerCameraControl()
{
}
void SBaslerCameraControl::initSome()
{
qDebug() << "SBaslerCameraControl: PylonInitialize initSome" ;
PylonInitialize();
CTlFactory &TlFactory = CTlFactory::GetInstance();
TlInfoList_t lstInfo;
int n = TlFactory.EnumerateTls(lstInfo);
TlInfoList_t::const_iterator it;
for ( it = lstInfo.begin(); it != lstInfo.end(); ++it ) {
qDebug() << "FriendlyName: " << it->GetFriendlyName() << "FullName: " << it->GetFullName();
qDebug() << "VendorName: " << it->GetVendorName() << "DeviceClass: " << it->GetDeviceClass() ;
}
UpdateCameraList();
emit sigCameraCount(n);
qDebug() << "SBasler Camera Count: " << n;
}
void SBaslerCameraControl::deleteAll()
{
//停止采集
if(m_isOpenAcquire) {
StopAcquire();
}
//关闭摄像头
CloseCamera();
//关闭库
qDebug() << "SBaslerCameraControl deleteAll: PylonTerminate" ;
PylonTerminate();
qDebug() << "SBaslerCameraControl deleteAll: Close&