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 ======
# ====== 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

View File

@ -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": []
}
]
}

View File

@ -1,11 +1,16 @@
#pragma once
#include <QObject>
#include <QImage>
#include <CameraParams.h>
#include <MvCameraControl.h>
#include <MvErrorDefine.h>
#include <PixelType.h>
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);
};

View File

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

View File

@ -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<HikCamera *>(pUser);
HikCamera *instance = static_cast<HikCamera *>(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);
}

View File

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