313 lines
7.8 KiB
C++
313 lines
7.8 KiB
C++
#include "camerawidget.h"
|
|
#include <QDir>
|
|
#include <QDateTime>
|
|
#include <QDebug>
|
|
#include <QMessageBox>
|
|
#include "lightsource.h"
|
|
|
|
CameraWidget::CameraWidget(QWidget *parent)
|
|
: QFrame(parent)
|
|
, ui(new Ui::CameraWidget)
|
|
{
|
|
ui->setupUi(this);
|
|
initWidget();
|
|
}
|
|
|
|
CameraWidget::~CameraWidget()
|
|
{
|
|
delete ui;
|
|
delete myImage;
|
|
|
|
if(readCameraImageThread->isRunning())
|
|
{
|
|
readCameraImageThread->requestInterruption();
|
|
readCameraImageThread->wait();
|
|
delete readCameraImageThread;
|
|
}
|
|
|
|
if(myCamera)
|
|
{
|
|
myCamera->Close();
|
|
delete myCamera;
|
|
myCamera = nullptr;
|
|
}
|
|
}
|
|
|
|
void CameraWidget::initWidget()
|
|
{
|
|
//设置窗口属性
|
|
this->setWindowTitle("相机");
|
|
//this->setWindowFlags(Qt::WindowCloseButtonHint|Qt::Dialog);
|
|
//this->setWindowModality(Qt::ApplicationModal);
|
|
//this->setFixedSize(this->width(),this->height());
|
|
// 保证QLabel 可缩放
|
|
ui->lbShow->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
|
|
//初始化变量
|
|
isOpenDevice = false;
|
|
|
|
//生成保存图片文件夹
|
|
QString imagePath = QDir::currentPath()+"/myImage/";
|
|
QDir dstDir(imagePath);
|
|
if(!dstDir.exists())
|
|
{
|
|
if(!dstDir.mkdir(imagePath))
|
|
{
|
|
qDebug()<<"创建Image文件夹失败"<<endl;
|
|
}
|
|
}
|
|
|
|
//图像指针对象
|
|
myImage = new Mat();
|
|
|
|
readCameraImageThread = new ReadCameraImageThread();
|
|
connect(readCameraImageThread,SIGNAL(messageSGL()),this,SLOT(slotDisplay()));
|
|
connect(readCameraImageThread,SIGNAL(messageImageSGL(QImage)),this,SLOT(slotDisplayImage(QImage)));
|
|
|
|
on_pbFind_clicked();
|
|
on_pbOpen_clicked();
|
|
}
|
|
|
|
void CameraWidget::saveImage(QString format)
|
|
{
|
|
if(ui->lbShow->pixmap() == nullptr)
|
|
{
|
|
QMessageBox::warning(this,"警告","保存失败,未采集到图像");
|
|
return;
|
|
}
|
|
QString savePath = QDir::currentPath()+"/myImage/";
|
|
QString imagePath = QDir::currentPath()+"/myImage/";
|
|
QString curDate = QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss.zzz");
|
|
QString saveName = savePath + curDate + "." + format;
|
|
const QPixmap *curImage = ui->lbShow->pixmap();
|
|
qDebug() <<"saveName:"<<saveName;
|
|
if(curImage->save(saveName))
|
|
{
|
|
qDebug()<<"保存成功!";
|
|
}
|
|
else
|
|
{
|
|
qDebug()<<"保存失败!";
|
|
}
|
|
|
|
}
|
|
|
|
// 显示单张图像
|
|
void CameraWidget::display(const Mat* imagePtr)
|
|
{
|
|
qDebug()<<"single display ok"<<endl;
|
|
// 判断是黑白、彩色
|
|
QImage* qMyImage = new QImage();
|
|
if(imagePtr->channels()>1)
|
|
{
|
|
*qMyImage = QImage((const unsigned char*)(imagePtr->data),imagePtr->cols,imagePtr->rows,QImage::Format_RGB888);
|
|
}
|
|
else
|
|
{
|
|
*qMyImage = QImage((const unsigned char*)(imagePtr->data),imagePtr->cols,imagePtr->rows,QImage::Format_Indexed8);
|
|
}
|
|
|
|
*qMyImage = (*qMyImage).scaled(ui->lbShow->size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
|
|
|
|
//显示图像
|
|
ui->lbShow->setPixmap(QPixmap::fromImage(*qMyImage));
|
|
delete qMyImage;
|
|
|
|
}
|
|
|
|
void CameraWidget::slotDisplay()
|
|
{
|
|
qDebug()<<"continuous display ok";
|
|
QImage* qMyImage = new QImage();
|
|
if(myImage->channels()>1)
|
|
{
|
|
*qMyImage = QImage((const unsigned char*)(myImage->data),myImage->cols,myImage->rows,QImage::Format_RGB888);
|
|
}
|
|
else
|
|
{
|
|
*qMyImage = QImage((const unsigned char*)(myImage->data),myImage->cols,myImage->rows,QImage::Format_Indexed8);
|
|
}
|
|
|
|
*qMyImage = (*qMyImage).scaled(ui->lbShow->size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
|
|
|
|
//显示图像
|
|
ui->lbShow->setPixmap(QPixmap::fromImage(*qMyImage));
|
|
delete qMyImage;
|
|
|
|
}
|
|
|
|
void CameraWidget::slotDisplayImage(QImage myImage)
|
|
{
|
|
myImage = myImage.scaled(ui->lbShow->size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
|
|
ui->lbShow->setPixmap(QPixmap::fromImage(myImage));
|
|
|
|
}
|
|
|
|
|
|
void CameraWidget::on_pbFind_clicked()
|
|
{
|
|
ui->cbDevices->clear();
|
|
memset(&deviceList,0,sizeof (MV_CC_DEVICE_INFO_LIST));
|
|
// 枚举子网内所有设备
|
|
int nRet = CMvCamera::EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE,&deviceList);
|
|
if(MV_OK != nRet)
|
|
{
|
|
return;
|
|
}
|
|
for(unsigned int i=0; i<deviceList.nDeviceNum;i++)
|
|
{
|
|
MV_CC_DEVICE_INFO* pDeviceInfo = deviceList.pDeviceInfo[i];
|
|
QString strModelName = "";
|
|
if(pDeviceInfo->nTLayerType == MV_USB_DEVICE)
|
|
{
|
|
strModelName = (char*)pDeviceInfo->SpecialInfo.stUsb3VInfo.chModelName;
|
|
}
|
|
else if(pDeviceInfo->nTLayerType == MV_GIGE_DEVICE)
|
|
{
|
|
strModelName = (char*)pDeviceInfo->SpecialInfo.stGigEInfo.chModelName;
|
|
}
|
|
else
|
|
{
|
|
QMessageBox::warning(this,"警告","未知设备枚举");
|
|
return;
|
|
}
|
|
|
|
qDebug()<<"strModelName: "<<strModelName;
|
|
ui->cbDevices->addItem(strModelName);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void CameraWidget::on_pbOpen_clicked()
|
|
{
|
|
if(isOpenDevice)
|
|
{
|
|
return;
|
|
}
|
|
|
|
QString deviceModel = ui->cbDevices->currentText();
|
|
if(deviceModel == "")
|
|
{
|
|
//QMessageBox::warning(this,"警告","请选择设备");
|
|
return;
|
|
}
|
|
|
|
myCamera = CAMERAFIND;
|
|
if(nullptr==myCamera)
|
|
{
|
|
return;
|
|
}
|
|
int nIndex = ui->cbDevices->currentIndex();
|
|
|
|
//打开设备
|
|
int nRet = myCamera->Open(deviceList.pDeviceInfo[nIndex]);
|
|
qDebug()<<"Connect: "<<nRet<<endl;
|
|
if(MV_OK != nRet)
|
|
{
|
|
delete myCamera;
|
|
myCamera = nullptr;
|
|
QMessageBox::warning(this,"警告","打开设备失败!");
|
|
return;
|
|
}
|
|
|
|
qDebug()<<"TriggerMode:"<<myCamera->SetEnumValue("TriggerMode",1);
|
|
qDebug()<<"TriggerSource:"<<myCamera->SetEnumValue("TriggerSource",7);
|
|
qDebug()<<"SetExposureTime:"<<myCamera->SetFloatValue("ExposureTime",myCamera->ExposureTime);
|
|
qDebug()<<"StartCamera:"<<myCamera->StartGrabbing();
|
|
|
|
readCameraImageThread->getCameraPtr(myCamera);
|
|
readCameraImageThread->getImagePtr(myImage);
|
|
isOpenDevice = true;
|
|
ui->lbShow->setText("打开设备成功!");
|
|
|
|
}
|
|
|
|
|
|
void CameraWidget::on_pbClose_clicked()
|
|
{
|
|
if(myCamera)
|
|
{
|
|
on_pbStop_clicked();
|
|
myCamera->Close();
|
|
delete myCamera;
|
|
myCamera = nullptr;
|
|
isOpenDevice = false;
|
|
}
|
|
}
|
|
|
|
|
|
void CameraWidget::on_pbSingle_clicked()
|
|
{
|
|
if(!isOpenDevice)
|
|
{
|
|
QMessageBox::warning(this,"警告","采集失败,请打开设备!");
|
|
return;
|
|
}
|
|
LIGHTSOURCEFIND->LightOn(4);
|
|
Sleep(20);
|
|
Mat *image =new Mat();
|
|
//qDebug()<<"single SoftTriger:"<<myCamera->CommandExecute("TriggerSoftware");
|
|
// qDebug()<<"single ReadBuffer:"<<myCamera->ReadBuffer(*image);
|
|
myCamera->GetImage(*image,false);
|
|
display(image);
|
|
LIGHTSOURCEFIND->LightOff(4);
|
|
delete image;
|
|
}
|
|
|
|
|
|
void CameraWidget::on_pbStart_clicked()
|
|
{
|
|
|
|
if(!isOpenDevice)
|
|
{
|
|
QMessageBox::warning(this,"警告","采集失败,请打开设备!");
|
|
return;
|
|
}
|
|
LIGHTSOURCEFIND->LightOn(4);
|
|
Sleep(20);
|
|
if(!readCameraImageThread->isRunning())
|
|
{
|
|
readCameraImageThread->start();
|
|
}
|
|
|
|
}
|
|
|
|
void CameraWidget::on_pbStop_clicked()
|
|
{
|
|
if(readCameraImageThread->isRunning())
|
|
{
|
|
readCameraImageThread->requestInterruption();
|
|
readCameraImageThread->wait();
|
|
LIGHTSOURCEFIND->LightOff(1);
|
|
}
|
|
}
|
|
|
|
void CameraWidget::on_pbSaveBmp_clicked()
|
|
{
|
|
saveImage("bmp");
|
|
}
|
|
|
|
//void CameraWidget::on_pbSavePng_clicked()
|
|
//{
|
|
// saveImage("png");
|
|
//}
|
|
|
|
void CameraWidget::on_pbEnableOrDisableCrossHairLine_clicked()
|
|
{
|
|
if("开十字线"==ui->pbEnableOrDisableCrossHairLine->text())
|
|
{
|
|
readCameraImageThread->setEnableCrossHairLine(true);
|
|
ui->pbEnableOrDisableCrossHairLine->setText("关十字线");
|
|
}
|
|
else
|
|
{
|
|
readCameraImageThread->setEnableCrossHairLine(false);
|
|
ui->pbEnableOrDisableCrossHairLine->setText("开十字线");
|
|
}
|
|
}
|
|
|
|
void CameraWidget::on_pbSavePNG_clicked()
|
|
{
|
|
saveImage("png");
|
|
}
|