From e8ae6aa3b9f3c97dd3797a55c8c0c2e8f53fbfa8 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Tue, 26 May 2026 14:54:50 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=8D=95=E5=8F=8D=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=EF=BC=9A=E5=AE=9E=E7=8E=B01s=E6=8B=8D=E7=85=A7=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=B0=86=E7=85=A7=E7=89=87=E4=BC=A0=E5=9B=9E=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E7=94=B5=E8=84=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/HPPA.vcxproj | 6 +- HPPA/SingleLensReflexCameraWindow.cpp | 462 +++++++++++++++++++++++++- HPPA/SingleLensReflexCameraWindow.h | 102 ++++-- 3 files changed, 528 insertions(+), 42 deletions(-) diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index f012c11..4d97cbf 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -55,8 +55,8 @@ - D:\cpp_library\gdal2.2.3_vs2017\include;C:\Program Files\ResononAPI\include;D:\cpp_library\opencv3.4.11\opencv\build\include;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv2;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PCOMM\Include;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PortControl;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL;D:\cpp_project_vs2022\HPPA\HPPA;D:\cpp_library\libconfig-1.7.3\lib;D:\cpp_project_vs2022\HPPA\vincecontrol;D:\cpp_library\vincecontrol_vs2017;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\HPPA\IrisMultiMotorController\IrisMultiMotorController;D:\cpp_library\eigen-3.4-rc1;C:\Program Files\OrbbecSDK 2.7.6\include;$(IncludePath) - D:\cpp_library\opencv3.4.11\opencv\build\x64\vc15\lib;D:\cpp_library\gdal2.2.3_vs2017\lib;C:\Program Files\ResononAPI\lib64;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\x64\Debug;D:\cpp_library\libconfig-1.7.3\build\x64;D:\cpp_project_vs2022\HPPA\x64\Debug;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\HPPA\IrisMultiMotorController\x64\Debug;C:\Program Files\OrbbecSDK 2.7.6\lib;$(LibraryPath) + D:\cpp_library\gdal2.2.3_vs2017\include;C:\Program Files\ResononAPI\include;D:\cpp_library\opencv3.4.11\opencv\build\include;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv2;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PCOMM\Include;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PortControl;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL;D:\cpp_project_vs2022\HPPA\HPPA;D:\cpp_library\libconfig-1.7.3\lib;D:\cpp_project_vs2022\HPPA\vincecontrol;D:\cpp_library\vincecontrol_vs2017;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\HPPA\IrisMultiMotorController\IrisMultiMotorController;D:\cpp_library\eigen-3.4-rc1;C:\Program Files\OrbbecSDK 2.7.6\include;D:\cpp_library\EDSDK132010CD(13.20.10)\Windows\EDSDK_64\Header;$(IncludePath) + D:\cpp_library\opencv3.4.11\opencv\build\x64\vc15\lib;D:\cpp_library\gdal2.2.3_vs2017\lib;C:\Program Files\ResononAPI\lib64;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\x64\Debug;D:\cpp_library\libconfig-1.7.3\build\x64;D:\cpp_project_vs2022\HPPA\x64\Debug;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\HPPA\IrisMultiMotorController\x64\Debug;C:\Program Files\OrbbecSDK 2.7.6\lib;D:\cpp_library\EDSDK132010CD(13.20.10)\Windows\EDSDK_64\Library;$(LibraryPath) Spectral Insight @@ -66,7 +66,7 @@ - opencv_world3411.lib;opencv_world3411d.lib;gdal_i.lib;resonon-basler.lib;AutoFocus_InspireLinearMotor_DLL.lib;libconfig++d.lib;vincecontrol.lib;resonon-allied.lib;xiapi64.lib;IrisMultiMotorController.lib;OrbbecSDK.lib;%(AdditionalDependencies) + opencv_world3411.lib;opencv_world3411d.lib;gdal_i.lib;resonon-basler.lib;AutoFocus_InspireLinearMotor_DLL.lib;libconfig++d.lib;vincecontrol.lib;resonon-allied.lib;xiapi64.lib;IrisMultiMotorController.lib;OrbbecSDK.lib;EDSDK.lib;%(AdditionalDependencies) D:\cpp_project_vs2022\HPPA\x64\Debug;%(AdditionalLibraryDirectories) diff --git a/HPPA/SingleLensReflexCameraWindow.cpp b/HPPA/SingleLensReflexCameraWindow.cpp index 04767ed..0ed2af9 100644 --- a/HPPA/SingleLensReflexCameraWindow.cpp +++ b/HPPA/SingleLensReflexCameraWindow.cpp @@ -1,4 +1,9 @@ #include "SingleLensReflexCameraWindow.h" +#include +#include + +// 全局变量用于回调函数访问 +static SingleLensReflexCameraOperation* g_cameraOperation = nullptr; SingleLensReflexCameraWindow::SingleLensReflexCameraWindow(QWidget* parent) : QDialog(parent) @@ -12,6 +17,7 @@ SingleLensReflexCameraWindow::SingleLensReflexCameraWindow(QWidget* parent) connect(ui.openSLRCamera_btn, &QPushButton::clicked, this, &SingleLensReflexCameraWindow::openSLRCamera); connect(ui.closeSLRCamera_btn, &QPushButton::clicked, this, &SingleLensReflexCameraWindow::closeSLRCamera); + connect(this, &SingleLensReflexCameraWindow::closeSLRCameraSignal, m_SingleLensReflexCameraOperation, &SingleLensReflexCameraOperation::CloseSLRCamera); connect(this, &SingleLensReflexCameraWindow::openSLRCameraSignal, m_SingleLensReflexCameraOperation, &SingleLensReflexCameraOperation::OpenSLRCamera); @@ -20,10 +26,23 @@ SingleLensReflexCameraWindow::SingleLensReflexCameraWindow(QWidget* parent) connect(m_SingleLensReflexCameraOperation, &SingleLensReflexCameraOperation::PlotSignal, this, &SingleLensReflexCameraWindow::PlotSLRImageSignal); connect(m_SingleLensReflexCameraOperation, &SingleLensReflexCameraOperation::CamClosedSignal, this, &SingleLensReflexCameraWindow::SLRCamClosedSignal); + + // 新增信号连接 + connect(m_SingleLensReflexCameraOperation, &SingleLensReflexCameraOperation::ImageCapturedSignal, this, &SingleLensReflexCameraWindow::onImageCaptured); + connect(m_SingleLensReflexCameraOperation, &SingleLensReflexCameraOperation::ErrorSignal, this, &SingleLensReflexCameraWindow::onError); + + // 初始化按钮状态 + ui.closeSLRCamera_btn->setEnabled(false); } SingleLensReflexCameraWindow::~SingleLensReflexCameraWindow() { + // 先停止拍照 + if (m_SingleLensReflexCameraOperation->getRecordStatus()) + { + m_SingleLensReflexCameraOperation->CloseSLRCamera(); + } + m_SLRCameraThread->quit(); m_SLRCameraThread->wait(); delete m_SingleLensReflexCameraOperation; @@ -42,42 +61,419 @@ void SingleLensReflexCameraWindow::onCamOpened() { ui.openSLRCamera_btn->setEnabled(false); ui.closeSLRCamera_btn->setEnabled(true); - ui.openSLRCamera_btn->setText(QString::fromLocal8Bit("已打开")); } void SingleLensReflexCameraWindow::closeSLRCamera() { - m_SingleLensReflexCameraOperation->CloseSLRCamera(); + emit closeSLRCameraSignal(); + //m_SingleLensReflexCameraOperation->CloseSLRCamera(); } void SingleLensReflexCameraWindow::onCamClosed() { ui.openSLRCamera_btn->setEnabled(true); ui.closeSLRCamera_btn->setEnabled(false); - ui.openSLRCamera_btn->setText(QString::fromLocal8Bit("打 开")); } +void SingleLensReflexCameraWindow::onImageCaptured(const QString& filePath) +{ + std::cout << "Image captured: " << filePath.toStdString() << std::endl; + // 可以在这里更新UI显示最新拍摄的图片 +} + +void SingleLensReflexCameraWindow::onError(const QString& errorMsg) +{ + QMessageBox::warning(this, QString::fromLocal8Bit("相机错误"), errorMsg); +} + //------------------------------------------------------------------------------------------------------------------------------- +// SingleLensReflexCameraOperation 实现 +//------------------------------------------------------------------------------------------------------------------------------- + SingleLensReflexCameraOperation::SingleLensReflexCameraOperation() { m_func = nullptr; record = false; + m_camera = nullptr; + m_isSDKInitialized = false; + m_isSessionOpen = false; + m_captureTimer = nullptr; + m_imageCounter = 0; + + // 设置保存路径(可以根据需要修改) + m_savePath = QCoreApplication::applicationDirPath() + "/CapturedImages/"; + + // 创建保存目录 + QDir dir; + if (!dir.exists(m_savePath)) + { + dir.mkpath(m_savePath); + } + + g_cameraOperation = this; } SingleLensReflexCameraOperation::~SingleLensReflexCameraOperation() { + if (record) + { + CloseSLRCamera(); + } + g_cameraOperation = nullptr; +} + +EdsError SingleLensReflexCameraOperation::initializeSDK() +{ + EdsError err = EdsInitializeSDK(); + if (err == EDS_ERR_OK) + { + m_isSDKInitialized = true; + std::cout << "EDSDK initialized successfully" << std::endl; + } + else + { + std::cout << "Failed to initialize EDSDK, error: " << err << std::endl; + } + return err; +} + +EdsError SingleLensReflexCameraOperation::terminateSDK() +{ + if (m_isSDKInitialized) + { + EdsError err = EdsTerminateSDK(); + m_isSDKInitialized = false; + std::cout << "EDSDK terminated" << std::endl; + return err; + } + return EDS_ERR_OK; +} + +EdsError SingleLensReflexCameraOperation::openCamera() +{ + EdsError err = EDS_ERR_OK; + EdsCameraListRef cameraList = nullptr; + EdsUInt32 count = 0; + + // 获取相机列表 + err = EdsGetCameraList(&cameraList); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to get camera list, error: " << err << std::endl; + return err; + } + + // 获取相机数量 + err = EdsGetChildCount(cameraList, &count); + if (err != EDS_ERR_OK || count == 0) + { + std::cout << "No camera found" << std::endl; + EdsRelease(cameraList); + return EDS_ERR_DEVICE_NOT_FOUND; + } + + std::cout << "Found " << count << " camera(s)" << std::endl; + + // 获取第一台相机 + err = EdsGetChildAtIndex(cameraList, 0, &m_camera); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to get camera, error: " << err << std::endl; + EdsRelease(cameraList); + return err; + } + + // 释放相机列表 + EdsRelease(cameraList); + + // 设置事件回调 + err = EdsSetObjectEventHandler(m_camera, kEdsObjectEvent_All, handleObjectEvent, this); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to set object event handler, error: " << err << std::endl; + } + + err = EdsSetPropertyEventHandler(m_camera, kEdsPropertyEvent_All, handlePropertyEvent, this); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to set property event handler, error: " << err << std::endl; + } + + err = EdsSetCameraStateEventHandler(m_camera, kEdsStateEvent_All, handleStateEvent, this); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to set state event handler, error: " << err << std::endl; + } + + // 打开会话 + err = EdsOpenSession(m_camera); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to open session, error: " << err << std::endl; + EdsRelease(m_camera); + m_camera = nullptr; + return err; + } + + m_isSessionOpen = true; + std::cout << "Camera session opened successfully" << std::endl; + + return EDS_ERR_OK; +} + +EdsError SingleLensReflexCameraOperation::closeCamera() +{ + EdsError err = EDS_ERR_OK; + + if (m_isSessionOpen && m_camera != nullptr) + { + err = EdsCloseSession(m_camera); + m_isSessionOpen = false; + std::cout << "Camera session closed" << std::endl; + } + + if (m_camera != nullptr) + { + EdsRelease(m_camera); + m_camera = nullptr; + } + + return err; +} + +EdsError SingleLensReflexCameraOperation::setupSaveToHost() +{ + EdsError err = EDS_ERR_OK; + + // 设置保存到PC + EdsUInt32 saveTo = kEdsSaveTo_Host; + err = EdsSetPropertyData(m_camera, kEdsPropID_SaveTo, 0, sizeof(saveTo), &saveTo); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to set SaveTo property, error: " << err << std::endl; + return err; + } + + // 设置PC容量(告诉相机PC有足够空间) + EdsCapacity capacity; + capacity.numberOfFreeClusters = 0x7FFFFFFF; + capacity.bytesPerSector = 0x1000; + capacity.reset = true; + err = EdsSetCapacity(m_camera, capacity); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to set capacity, error: " << err << std::endl; + return err; + } + + std::cout << "Save to host configured successfully" << std::endl; + return EDS_ERR_OK; +} + +EdsError SingleLensReflexCameraOperation::takePicture() +{ + EdsError err = EDS_ERR_OK; + + // 按下快门 + err = EdsSendCommand(m_camera, kEdsCameraCommand_PressShutterButton, kEdsCameraCommand_ShutterButton_Completely); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to press shutter button, error: " << err << std::endl; + return err; + } + + // 释放快门 + err = EdsSendCommand(m_camera, kEdsCameraCommand_PressShutterButton, kEdsCameraCommand_ShutterButton_OFF); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to release shutter button, error: " << err << std::endl; + return err; + } + + std::cout << "Picture taken" << std::endl; + return EDS_ERR_OK; +} + +EdsError SingleLensReflexCameraOperation::downloadImage(EdsDirectoryItemRef directoryItem) +{ + EdsError err = EDS_ERR_OK; + EdsStreamRef stream = nullptr; + EdsDirectoryItemInfo dirItemInfo; + + // 获取文件信息 + err = EdsGetDirectoryItemInfo(directoryItem, &dirItemInfo); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to get directory item info, error: " << err << std::endl; + return err; + } + + // 生成保存文件名(使用时间戳) + QString timestamp = QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss_zzz"); + QString fileName = m_savePath + "IMG_" + timestamp + "_" + QString::fromLocal8Bit(dirItemInfo.szFileName); + + std::cout << "Downloading image to: " << fileName.toStdString() << std::endl; + + // 创建文件流 + err = EdsCreateFileStream(fileName.toLocal8Bit().constData(), + kEdsFileCreateDisposition_CreateAlways, + kEdsAccess_ReadWrite, &stream); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to create file stream, error: " << err << std::endl; + return err; + } + + // 下载图像 + err = EdsDownload(directoryItem, dirItemInfo.size, stream); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to download image, error: " << err << std::endl; + EdsRelease(stream); + return err; + } + + // 通知下载完成 + err = EdsDownloadComplete(directoryItem); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to complete download, error: " << err << std::endl; + } + + // 释放流 + EdsRelease(stream); + + std::cout << "Image downloaded successfully: " << fileName.toStdString() << std::endl; + + // 发送信号通知图片已保存 + emit ImageCapturedSignal(fileName); + + return EDS_ERR_OK; +} + +// 静态回调函数实现 +EdsError EDSCALLBACK SingleLensReflexCameraOperation::handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid* context) +{ + SingleLensReflexCameraOperation* pThis = static_cast(context); + + switch (event) + { + case kEdsObjectEvent_DirItemRequestTransfer: + // 有图像需要传输 + if (pThis != nullptr) + { + pThis->downloadImage(object); + } + break; + + case kEdsObjectEvent_DirItemCreated: + std::cout << "New file created on camera" << std::endl; + break; + + default: + break; + } + + // 释放对象 + if (object) + { + EdsRelease(object); + } + + return EDS_ERR_OK; +} + +EdsError EDSCALLBACK SingleLensReflexCameraOperation::handlePropertyEvent(EdsPropertyEvent event, EdsPropertyID property, EdsUInt32 param, EdsVoid* context) +{ + switch (event) + { + case kEdsPropertyEvent_PropertyChanged: + // 属性已更改 + break; + default: + break; + } + return EDS_ERR_OK; +} + +EdsError EDSCALLBACK SingleLensReflexCameraOperation::handleStateEvent(EdsStateEvent event, EdsUInt32 parameter, EdsVoid* context) +{ + SingleLensReflexCameraOperation* pThis = static_cast(context); + + switch (event) + { + case kEdsStateEvent_Shutdown: + std::cout << "Camera disconnected" << std::endl; + if (pThis != nullptr && pThis->record) + { + pThis->CloseSLRCamera(); + } + break; + + case kEdsStateEvent_WillSoonShutDown: + // 相机即将自动关机,延长计时器 + if (pThis != nullptr && pThis->m_camera != nullptr) + { + EdsSendCommand(pThis->m_camera, kEdsCameraCommand_ExtendShutDownTimer, 0); + } + break; + + default: + break; + } + return EDS_ERR_OK; } void SingleLensReflexCameraOperation::OpenSLRCamera() { - + std::cout << "SingleLensReflexCameraOperation::OpenSLRCamera, 打开单反相机" << std::endl; + + EdsError err = EDS_ERR_OK; + + // 初始化SDK + err = initializeSDK(); + if (err != EDS_ERR_OK) + { + emit ErrorSignal(QString::fromLocal8Bit("初始化SDK失败,错误码: %1").arg(err)); + return; + } + + // 打开相机 + err = openCamera(); + if (err != EDS_ERR_OK) + { + terminateSDK(); + emit ErrorSignal(QString::fromLocal8Bit("打开相机失败,错误码: %1").arg(err)); + return; + } + + // 设置保存到PC + err = setupSaveToHost(); + if (err != EDS_ERR_OK) + { + closeCamera(); + terminateSDK(); + emit ErrorSignal(QString::fromLocal8Bit("设置保存位置失败,错误码: %1").arg(err)); + return; + } + + record = true; + + // 创建并启动定时器(1秒拍一张) + m_captureTimer = new QTimer(this); + connect(m_captureTimer, &QTimer::timeout, this, &SingleLensReflexCameraOperation::onCaptureTimer); + m_captureTimer->start(2000); // 1000毫秒 = 1秒 + + emit CamOpenedSignal(); + + std::cout << "Camera opened and timer started (1 photo per second)" << std::endl; } void SingleLensReflexCameraOperation::OpenSLRCamera_callback() { - + // 不使用信号而使用回调函数来通知界面刷新视频 } void SingleLensReflexCameraOperation::setCallback(void(*func)()) @@ -85,11 +481,65 @@ void SingleLensReflexCameraOperation::setCallback(void(*func)()) m_func = func; } +void SingleLensReflexCameraOperation::onCaptureTimer() +{ + if (!record) + { + return; + } + + QMutexLocker locker(&m_mutex); + + // 处理相机事件(重要:需要定期调用以接收回调) + EdsGetEvent(); + + // 拍照 + EdsError err = takePicture(); + if (err != EDS_ERR_OK) + { + std::cout << "Failed to take picture, error: " << err << std::endl; + // 如果是设备忙,不发送错误信号,等待下次重试 + if (err != EDS_ERR_DEVICE_BUSY) + { + emit ErrorSignal(QString::fromLocal8Bit("拍照失败,错误码: %1").arg(err)); + } + } + + m_imageCounter++; + std::cout << "Total pictures taken: " << m_imageCounter << std::endl; +} + void SingleLensReflexCameraOperation::CloseSLRCamera() { std::cout << "SingleLensReflexCameraOperation::CloseSLRCamera,关闭单反相机" << std::endl; + QMutexLocker locker(&m_mutex); + record = false; + // 停止定时器 + if (m_captureTimer != nullptr) + { + m_captureTimer->stop(); + delete m_captureTimer; + m_captureTimer = nullptr; + } + + // 处理剩余事件 + for (int i = 0; i < 10; i++) + { + EdsGetEvent(); + QThread::msleep(100); + } + + // 关闭相机 + closeCamera(); + + // 终止SDK + terminateSDK(); + + std::cout << "Camera closed, total pictures: " << m_imageCounter << std::endl; + m_imageCounter = 0; + emit CamClosedSignal(); -} +} \ No newline at end of file diff --git a/HPPA/SingleLensReflexCameraWindow.h b/HPPA/SingleLensReflexCameraWindow.h index 43ac70f..64b145c 100644 --- a/HPPA/SingleLensReflexCameraWindow.h +++ b/HPPA/SingleLensReflexCameraWindow.h @@ -5,8 +5,11 @@ #include #include #include -#include +#include #include +#include +#include +#include #include #include "ui_SingleLensReflexCamera.h" @@ -14,63 +17,96 @@ #include #include + +// 包含Canon EDSDK头文件 +#include "EDSDK.h" +#include "EDSDKTypes.h" +#include "EDSDKErrors.h" + typedef void(*func)(); -class SingleLensReflexCameraOperation :public QObject +class SingleLensReflexCameraOperation : public QObject { - Q_OBJECT + Q_OBJECT public: - SingleLensReflexCameraOperation(); - ~SingleLensReflexCameraOperation(); + SingleLensReflexCameraOperation(); + ~SingleLensReflexCameraOperation(); - QImage m_colorImage; - QImage m_depthImage; - void setCallback(void(*func)()); - bool getRecordStatus() const { return record; } + QImage m_colorImage; + QImage m_depthImage; + void setCallback(void(*func)()); + bool getRecordStatus() const { return record; } private: - cv::Mat frame; + cv::Mat frame; + func m_func; + bool record; - func m_func; + // Canon EDSDK相关成员 + EdsCameraRef m_camera; + bool m_isSDKInitialized; + bool m_isSessionOpen; + QTimer* m_captureTimer; + QString m_savePath; + int m_imageCounter; + QMutex m_mutex; - bool record; + // EDSDK辅助函数 + EdsError initializeSDK(); + EdsError terminateSDK(); + EdsError openCamera(); + EdsError closeCamera(); + EdsError takePicture(); + EdsError setupSaveToHost(); + + // 静态回调函数 + static EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid* context); + static EdsError EDSCALLBACK handlePropertyEvent(EdsPropertyEvent event, EdsPropertyID property, EdsUInt32 param, EdsVoid* context); + static EdsError EDSCALLBACK handleStateEvent(EdsStateEvent event, EdsUInt32 parameter, EdsVoid* context); + + // 下载图像 + EdsError downloadImage(EdsDirectoryItemRef directoryItem); public slots: - void OpenSLRCamera(); - void OpenSLRCamera_callback();//不使用信号而使用回调函数来通知界面刷新视频 - void CloseSLRCamera(); + void OpenSLRCamera(); + void OpenSLRCamera_callback(); + void CloseSLRCamera(); + void onCaptureTimer(); signals: - void PlotSignal(); - - void CamOpenedSignal(); - void CamClosedSignal(); + void PlotSignal(); + void CamOpenedSignal(); + void CamClosedSignal(); + void ImageCapturedSignal(const QString& filePath); + void ErrorSignal(const QString& errorMsg); }; class SingleLensReflexCameraWindow : public QDialog { - Q_OBJECT + Q_OBJECT public: - SingleLensReflexCameraWindow(QWidget* parent = nullptr); - ~SingleLensReflexCameraWindow(); + SingleLensReflexCameraWindow(QWidget* parent = nullptr); + ~SingleLensReflexCameraWindow(); - SingleLensReflexCameraOperation* m_SingleLensReflexCameraOperation; + SingleLensReflexCameraOperation* m_SingleLensReflexCameraOperation; public Q_SLOTS: - void openSLRCamera(); - void onCamOpened(); - void closeSLRCamera(); - void onCamClosed(); + void openSLRCamera(); + void onCamOpened(); + void closeSLRCamera(); + void onCamClosed(); + void onImageCaptured(const QString& filePath); + void onError(const QString& errorMsg); signals: - void openSLRCameraSignal(); - void PlotSLRImageSignal(); - void SLRCamClosedSignal(); + void openSLRCameraSignal(); + void closeSLRCameraSignal(); + void PlotSLRImageSignal(); + void SLRCamClosedSignal(); private: - Ui::SingleLensReflexCameraClass ui; - QThread* m_SLRCameraThread; - + Ui::SingleLensReflexCameraClass ui; + QThread* m_SLRCameraThread; };