basicly done

This commit is contained in:
kaiza-hikaru-del 2025-06-08 14:51:23 +08:00
parent ed0895405a
commit 0cc98925c2
6 changed files with 76 additions and 32 deletions

View File

@ -28,18 +28,18 @@ target_include_directories(${PROJECT_NAME} PRIVATE
# ====== inner headers ====== # ====== inner headers ======
# ====== Qt6 & OpenCV ====== # ====== 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) find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::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) find_package(OpenCV REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS}) target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})
# ====== Qt6 & OpenCV ====== # ====== Qt6 & OpenCV ======
# ====== MVS ====== # ====== 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 target_include_directories(${PROJECT_NAME} PRIVATE
${MVS_DIR}/Includes ${MVS_DIR}/Includes

View File

@ -1,27 +1,27 @@
{ {
"configurations": [ "configurations": [
{ {
"name": "x64-Debug", "name": "x64-Debug",
"generator": "Ninja", "generator": "Ninja",
"configurationType": "Debug", "configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64_x64" ], "inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\out\\build\\${name}", "buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "", "cmakeCommandArgs": "",
"buildCommandArgs": "", "buildCommandArgs": "",
"ctestCommandArgs": "" "ctestCommandArgs": ""
}, },
{ {
"name": "x64-Release", "name": "x64-Release",
"generator": "Ninja", "generator": "Ninja",
"configurationType": "Release", "configurationType": "Release",
"buildRoot": "${projectDir}\\out\\build\\${name}", "buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "", "cmakeCommandArgs": "",
"buildCommandArgs": "", "buildCommandArgs": "",
"ctestCommandArgs": "", "ctestCommandArgs": "",
"inheritEnvironments": [ "msvc_x64_x64" ], "inheritEnvironments": [ "msvc_x64_x64" ],
"variables": [] "variables": []
} }
] ]
} }

View File

@ -1,11 +1,16 @@
#pragma once #pragma once
#include <QObject>
#include <QImage>
#include <CameraParams.h> #include <CameraParams.h>
#include <MvCameraControl.h> #include <MvCameraControl.h>
#include <MvErrorDefine.h> #include <MvErrorDefine.h>
#include <PixelType.h> #include <PixelType.h>
class HikCamera{ class HikCamera : public QObject{
Q_OBJECT
public: public:
// 获取单例实例 // 获取单例实例
static HikCamera &getInstance() { static HikCamera &getInstance() {
@ -31,6 +36,9 @@ public:
// 注册图像回调函数 // 注册图像回调函数
void registerImageCallback(); void registerImageCallback();
// 回调图像处理函数
void handleFrameData(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo);
// 禁用拷贝和移动 // 禁用拷贝和移动
HikCamera(const HikCamera &) = delete; HikCamera(const HikCamera &) = delete;
HikCamera(HikCamera &&) = delete; HikCamera(HikCamera &&) = delete;
@ -45,4 +53,7 @@ private:
// 相机句柄 // 相机句柄
void *m_handler = nullptr; void *m_handler = nullptr;
signals:
void newImage(const QImage &qimage);
}; };

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <QtWidgets> #include <QtWidgets>
#include <QImage>
class HikWidget : public QWidget { class HikWidget : public QWidget {
Q_OBJECT Q_OBJECT
@ -11,6 +12,9 @@ private:
void initUI(); void initUI();
void connectAllSignalsAndSlots(); void connectAllSignalsAndSlots();
// 图像变量
QImage m_image;
// 左侧视图 // 左侧视图
QGraphicsScene *m_scene; QGraphicsScene *m_scene;
QGraphicsPixmapItem *m_pixmapItem; QGraphicsPixmapItem *m_pixmapItem;

View File

@ -6,10 +6,10 @@
// 静态成员函数作为SDK回调函数 // 静态成员函数作为SDK回调函数
static void __stdcall ImageCallback(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo, void *pUser) { static void __stdcall ImageCallback(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo, void *pUser) {
// 将用户数据转换为HikCamera实例 // 将用户数据转换为HikCamera实例
/*HikCamera *instance = static_cast<HikCamera *>(pUser); HikCamera *instance = static_cast<HikCamera *>(pUser);
if (instance) { if (instance) {
instance->handleFrameData(pData, pFrameInfo); instance->handleFrameData(pData, pFrameInfo);
}*/ }
} }
void HikCamera::init() { void HikCamera::init() {
@ -27,6 +27,10 @@ void HikCamera::init() {
// 打开相机 // 打开相机
nRet = MV_CC_OpenDevice(m_handler); 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() { void HikCamera::deinit() {
@ -57,5 +61,19 @@ void HikCamera::setGain(double gain) {}
void HikCamera::registerImageCallback() { void HikCamera::registerImageCallback() {
int nRet = MV_OK; 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);
} }

View File

@ -196,4 +196,15 @@ void HikWidget::connectAllSignalsAndSlots() {
HikCamera::getInstance().setGain(value); 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);
} }