diff --git a/CMakeLists.txt b/CMakeLists.txt index f0c061c..fbcdf1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,18 +28,18 @@ target_include_directories(${PROJECT_NAME} PRIVATE # ====== inner headers ====== # ====== Qt6 & OpenCV ====== -set(Qt6_DIR "D:/Environments/Qt/Qt6.9/6.9.0/msvc2022_64/lib/cmake/Qt6" CACHE PATH "Path to Qt6 SDK") +set(Qt6_DIR "D:/ProgramData/Qt6.9/6.9.0/msvc2022_64/lib/cmake/Qt6" CACHE PATH "Path to Qt6 SDK") find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets) -set(OpenCV_DIR "D:/Environments/opencv/build" CACHE PATH "Path to OpenCV SDK") +set(OpenCV_DIR "D:/ProgramData/OpenCV4.11.0/build" CACHE PATH "Path to OpenCV SDK") find_package(OpenCV REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS}) # ====== Qt6 & OpenCV ====== # ====== MVS ====== -set(MVS_DIR "D:/Environments/MVS/Development" CACHE PATH "Path to MVS SDK") +set(MVS_DIR "D:/Program Files/MVS/Development" CACHE PATH "Path to MVS SDK") target_include_directories(${PROJECT_NAME} PRIVATE ${MVS_DIR}/Includes diff --git a/CMakeSettings.json b/CMakeSettings.json index b58599c..207648b 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1,27 +1,27 @@ { - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "Release", - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] - } - ] + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "Release", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [] + } + ] } \ No newline at end of file diff --git a/include/HikCamera.hpp b/include/HikCamera.hpp index 4033aec..714d10b 100644 --- a/include/HikCamera.hpp +++ b/include/HikCamera.hpp @@ -1,11 +1,16 @@ #pragma once +#include +#include + #include #include #include #include -class HikCamera{ +class HikCamera : public QObject{ + Q_OBJECT + public: // 获取单例实例 static HikCamera &getInstance() { @@ -31,6 +36,9 @@ public: // 注册图像回调函数 void registerImageCallback(); + // 回调图像处理函数 + void handleFrameData(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo); + // 禁用拷贝和移动 HikCamera(const HikCamera &) = delete; HikCamera(HikCamera &&) = delete; @@ -45,4 +53,7 @@ private: // 相机句柄 void *m_handler = nullptr; + +signals: + void newImage(const QImage &qimage); }; \ No newline at end of file diff --git a/include/HikWidget.hpp b/include/HikWidget.hpp index 7ba353a..62164e5 100644 --- a/include/HikWidget.hpp +++ b/include/HikWidget.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include class HikWidget : public QWidget { Q_OBJECT @@ -11,6 +12,9 @@ private: void initUI(); void connectAllSignalsAndSlots(); + // 图像变量 + QImage m_image; + // 左侧视图 QGraphicsScene *m_scene; QGraphicsPixmapItem *m_pixmapItem; diff --git a/src/HikCamera.cpp b/src/HikCamera.cpp index 016da4e..308f64e 100644 --- a/src/HikCamera.cpp +++ b/src/HikCamera.cpp @@ -6,10 +6,10 @@ // 静态成员函数作为SDK回调函数 static void __stdcall ImageCallback(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo, void *pUser) { // 将用户数据转换为HikCamera实例 - /*HikCamera *instance = static_cast(pUser); + HikCamera *instance = static_cast(pUser); if (instance) { instance->handleFrameData(pData, pFrameInfo); - }*/ + } } void HikCamera::init() { @@ -27,6 +27,10 @@ void HikCamera::init() { // 打开相机 nRet = MV_CC_OpenDevice(m_handler); + + // 设置像素格式为 RGB8 + nRet = MV_CC_SetEnumValue(m_handler, "PixelFormat", PixelType_Gvsp_RGB8_Packed); + if (nRet == MV_OK) { std::cout << "Set pixel fomat succeed" << std::endl; } } void HikCamera::deinit() { @@ -57,5 +61,19 @@ void HikCamera::setGain(double gain) {} void HikCamera::registerImageCallback() { int nRet = MV_OK; - nRet = MV_CC_RegisterImageCallBackEx(m_handler, ImageCallback, nullptr); + nRet = MV_CC_RegisterImageCallBackEx(m_handler, ImageCallback, this); + nRet = MV_CC_SetImageNodeNum(m_handler, 10); +} + +void HikCamera::handleFrameData(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo) { + if (!pData) { + std::cout << "New image nullptr" << std::endl; + } + const int width = pFrameInfo->nExtendWidth; + const int height = pFrameInfo->nExtendHeight; + const int dataBytesPerLine = pFrameInfo->nExtendWidth * 3; + + QImage deepCopy(width, height, QImage::Format_RGB888); + if (pData) { memcpy(deepCopy.bits(), pData, pFrameInfo->nFrameLenEx); } + emit newImage(deepCopy); } diff --git a/src/HikWidget.cpp b/src/HikWidget.cpp index 4f4e36b..1f6a3ac 100644 --- a/src/HikWidget.cpp +++ b/src/HikWidget.cpp @@ -196,4 +196,15 @@ void HikWidget::connectAllSignalsAndSlots() { HikCamera::getInstance().setGain(value); }); + // 新图像到来 + connect(&HikCamera::getInstance(), &HikCamera::newImage, this, + [this](const QImage &qimage) { + if (qimage.isNull()) { + qDebug() << "Qimage invalid"; + } + m_image = qimage; + QPixmap pixmap = QPixmap::fromImage(qimage); + m_pixmapItem->setPixmap(pixmap); + m_gv->fitInView(m_pixmapItem, Qt::KeepAspectRatio); + }, Qt::QueuedConnection); }