Files
newspark110/device/ui/camerawidget.cpp
Chenwenxuan edac2715f0 init
2024-03-06 14:54:30 +08:00

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");
}