diff --git a/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Build/Make/Makefile b/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Build/Make/Makefile index ef5fc85..5d88600 100644 --- a/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Build/Make/Makefile +++ b/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Build/Make/Makefile @@ -12,40 +12,50 @@ BIN_FILE = $(PROJECT_NAME) BIN_DIR = binary/$(CONFIG_DIR) OBJ_DIR = object/$(CONFIG_DIR) BIN_PATH = $(BIN_DIR)/$(BIN_FILE) +# Qt 工具路径 +MOC = /usr/lib/aarch64-linux-gnu/qt5/bin/moc +UIC = /usr/lib/aarch64-linux-gnu/qt5/bin/uic +RCC = /usr/lib/aarch64-linux-gnu/qt5/bin/rcc + +# 使用 pkg-config 获取 Qt 编译标志 +QT_CFLAGS := $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) +QT_LIBS := $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) all: $(BIN_PATH) include $(MAKE_INCLUDE_DIR)/VimbaCPP.mk include $(MAKE_INCLUDE_DIR)/VimbaImageTransform.mk -include $(MAKE_INCLUDE_DIR)/Qt.mk + SOURCE_DIR = $(PROJECT_DIR)/Source INCLUDE_DIRS = -I$(SOURCE_DIR) \ - -I$(EXAMPLES_DIR) \ - -I$(OBJ_DIR) + -I$(EXAMPLES_DIR) \ + -I$(OBJ_DIR) \ + -I/usr/include/aarch64-linux-gnu/qt5 \ + -I/usr/include/aarch64-linux-gnu/qt5/QtCore \ + -I/usr/include/aarch64-linux-gnu/qt5/QtGui \ + -I/usr/include/aarch64-linux-gnu/qt5/QtWidgets -OPENCV_CFLAGS = $(shell $(PKGCFG) --cflags opencv) -OPENCV_LIBS = $(shell $(PKGCFG) --libs opencv) +OPENCV_CFLAGS = $(shell $(PKGCFG) --cflags opencv4) + +OPENCV_LIBS = $(shell $(PKGCFG) --libs opencv4) LIBS = $(VIMBACPP_LIBS) \ $(VIMBAIMAGETRANSFORM_LIBS) \ - $(QTCORE_LIBS) \ - $(QTGUI_LIBS) \ + $(QT_LIBS) \ $(OPENCV_LIBS) DEFINES = - CFLAGS = $(COMMON_CFLAGS) \ $(VIMBACPP_CFLAGS) \ $(VIMBAIMAGETRANSFORM_CFLAGS) \ - $(QTCORE_CFLAGS) \ - $(QTGUI_CFLAGS) \ + $(QT_CFLAGS) \ $(OPENCV_CFLAGS) OBJ_FILES = $(OBJ_DIR)/ApiController.o \ @@ -62,9 +72,7 @@ OBJ_FILES = $(OBJ_DIR)/ApiController.o \ GEN_HEADERS = $(OBJ_DIR)/ui_AsynchronousOpenCVRecorder.h DEPENDENCIES = VimbaCPP \ - VimbaImageTransform \ - QtCore \ - QtGui + VimbaImageTransform $(OBJ_DIR)/moc_%.cpp: $(SOURCE_DIR)/%.h $(OBJ_DIR) $(MOC) -o $@ $< diff --git a/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Source/OpenCVVideoRecorder.h b/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Source/OpenCVVideoRecorder.h index 47194c8..b3a5a16 100644 --- a/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Source/OpenCVVideoRecorder.h +++ b/Vimba_6_0/VimbaCPP/Examples/AsynchronousOpenCVRecorder/Qt/Source/OpenCVVideoRecorder.h @@ -90,7 +90,18 @@ the use of this software, even if advised of the possibility of such damage. #include "VmbTransform.h" #include +#include // 必须包含 videoio 以使用 VideoWriter +#include +// 替换原有的 enum 定义 +static const int FOURCC_USER_SELECT = -1; // 替代 CV_FOURCC_PROMPT +static const int FOURCC_DEFAULT = cv::VideoWriter::fourcc('I','Y','U','V'); +static const int FOURCC_MPEG1 = cv::VideoWriter::fourcc('P','I','M','1'); +static const int FOURCC_MJPEG = cv::VideoWriter::fourcc('M','J','P','G'); +static const int FOURCC_MPEG42 = cv::VideoWriter::fourcc('M','P','4','2'); +static const int FOURCC_MPEG43 = cv::VideoWriter::fourcc('M','P','4','3'); +static const int FOURCC_DIVX = cv::VideoWriter::fourcc('D','I','V','X'); +static const int FOURCC_X264 = cv::VideoWriter::fourcc('X','2','6','4'); // // Base exception // @@ -130,17 +141,6 @@ class OpenCVRecorder: public QThread // Example FOURCC codes that can be used with the OpenCVRecorder // VmbUint32_t maxQueueElements() const { return 3; } - enum - { - FOURCC_USER_SELECT = CV_FOURCC_PROMPT, - FOURCC_DEFAULT = CV_FOURCC_MACRO('I','Y','U','V'), - FOURCC_MPEG1 = CV_FOURCC_MACRO('P','I','M','1'), - FOURCC_MJPEG = CV_FOURCC_MACRO('M','J','P','G'), - FOURCC_MPEG42 = CV_FOURCC_MACRO('M','P','4','2'), - FOURCC_MPEG43 = CV_FOURCC_MACRO('M','P','4','3'), - FOURCC_DIVX = CV_FOURCC_MACRO('D','I','V','X'), - FOURCC_X264 = CV_FOURCC_MACRO('X','2','6','4'), - }; // // frame data temporary storage // @@ -305,10 +305,10 @@ class OpenCVRecorder: public QThread public: OpenCVRecorder(const QString &fileName, VmbFloat_t fps, VmbUint32_t Width, VmbUint32_t Height) : m_StopThread( false ) -#ifdef _MSC_VER // codec selection only supported by Windows - , m_VideoWriter(fileName.toStdString(), FOURCC_USER_SELECT, fps, cv::Size(Width,Height),true ) +#ifdef _MSC_VER // Windows 下支持手动选择编码器 + , m_VideoWriter(fileName.toStdString(), FOURCC_USER_SELECT, fps, cv::Size(Width, Height), true) #else - , m_VideoWriter(fileName.toStdString(), FOURCC_X264, fps, cv::Size(Width,Height),true ) + , m_VideoWriter(fileName.toStdString(), FOURCC_X264, fps, cv::Size(Width, Height), true) #endif , m_ConvertImage( Height, Width, CV_8UC3) { @@ -398,4 +398,20 @@ public: } }; +class RTSPStreamer { +public: + RTSPStreamer(const std::string& rtsp_url, int width, int height, int fps); + ~RTSPStreamer(); + bool pushFrame(const cv::Mat& frame); + bool isConnected() const { return m_connected; } + +private: + std::string m_rtspUrl; + AVFormatContext* m_fmtCtx = nullptr; + AVCodecContext* m_codecCtx = nullptr; + AVStream* m_stream = nullptr; + SwsContext* m_swsCtx = nullptr; + std::atomic m_connected{false}; + int m_width, m_height, m_fps; +}; #endif \ No newline at end of file