qt項目:大恆相機實時采集,單幀采集,並且在屏幕上顯示,含有保存bmp圖片功能


ref: 

https://blog.csdn.net/qq_35299223/article/details/103754599?utm_medium=distribute.pc_relevant_download.none-task-blog-2~default~searchFromBaidu~default-10.test_version_3&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-2~default~searchFromBaidu~default-10.test_version_

 

軟件框架

在這里插入圖片描述

ui界面框架在這里插入圖片描述

 

.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2019-12-20T09:41:39
#
#-------------------------------------------------

QT       += core gui
QT+=charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

TARGET = RailMeasurement
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp \
    qcustomplot.cpp \
    camerawindow.cpp \
    mat2qtformatmethod.cpp \
    cgxbitmap.cpp \
    convertstring.cpp \
    drawwidget.cpp

HEADERS += \
        mainwindow.h \
    qcustomplot.h \
    camerawindow.h \
    mat2qtformatmethod.h \
    cgxbitmap.h \
    convertstring.h \
    drawwidget.h

FORMS += \
        mainwindow.ui \
    camerawindow.ui

# opencv環境,添加了imgproc,core,highui庫
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_imgproc2413
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_imgproc2413d
else:unix: LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_imgproc2413

INCLUDEPATH += $$PWD/../../cvpack/package/opencv/build/include
DEPENDPATH += $$PWD/../../cvpack/package/opencv/build/include


win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_core2413
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_core2413d
else:unix: LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_core2413

INCLUDEPATH += $$PWD/../../cvpack/package/opencv/build/include
DEPENDPATH += $$PWD/../../cvpack/package/opencv/build/include


win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_highgui2413
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_highgui2413d
else:unix: LIBS += -L$$PWD/../../cvpack/package/opencv/build/x64/vc14/lib/ -lopencv_highgui2413

INCLUDEPATH += $$PWD/../../cvpack/package/opencv/build/include
DEPENDPATH += $$PWD/../../cvpack/package/opencv/build/include

# 大恆sdk環境,添加了C++庫和包含路徑,沒有添加c程序的庫
unix|win32: LIBS += -L$$PWD/'../../CameraDemo/C++ SDK/lib/x64/' -lGxIAPICPPEx

INCLUDEPATH += $$PWD/'../../CameraDemo/C++ SDK/lib/x64'
DEPENDPATH += $$PWD/'../../CameraDemo/C++ SDK/lib/x64'

INCLUDEPATH += $$PWD/'../../CameraDemo/C++ SDK/inc'
DEPENDPATH += $$PWD/'../../CameraDemo/C++ SDK/inc'

CONFIG +=C++11

camerawindow.h

  1 #ifndef CAMERAWINDOW_H
  2 #define CAMERAWINDOW_H
  3 #include "GalaxyIncludes.h"
  4 #include <QDebug>
  5 #include <opencv2/core.hpp>
  6 #include <opencv2/highgui.hpp>
  7 #include <opencv2/imgproc.hpp>
  8 #include "mat2qtformatmethod.h"
  9 #include <QPixmap>
 10 #include <QImage>
 11 #include <QLabel>
 12 #include <QMessageBox>
 13 #include <string>
 14 #include "cgxbitmap.h"
 15 #include "convertstring.h"
 16 #include <time.h>
 17 #include <QPainter>
 18 #include "drawwidget.h"
 19 
 20 
 21 struct CameraWindowGeoParams{
 22     int WidgetWidth;
 23     int WidgetHeight;
 24     int LabelWidth;
 25     int LabelHeight;
 26     int LineeditWidth;
 27     int LineeditHeight;
 28     int ButtonWidth;
 29     int ButtonHeight;
 30 };
 31 struct MyUserParam{
 32     cv::Mat CurImgMat;
 33     QLabel* LabelShowImgPtr;
 34 };
 35 
 36 
 37 
 38 #include <QWidget>
 39 
 40 namespace Ui {
 41 class CameraWindow;
 42 struct CameraWindowGeoParams;
 43 //class CSampleCaptureEventHandler;
 44 }
 45 
 46 class CameraWindow : public QWidget
 47 {
 48     Q_OBJECT
 49 
 50 private:
 51     //回調采集事件類
 52     class CSampleCaptureEventHandler : public ICaptureEventHandler
 53      {
 54     public:
 55 
 56        void DoOnImageCaptured(CImageDataPointer& objImageDataPointer, void* pUserParam)
 57        {
 58 
 59            if (objImageDataPointer->GetStatus() == GX_FRAME_STATUS_SUCCESS)
 60            {                  
 61                CameraWindow* CamUiPtr=(CameraWindow*)pUserParam;
 62                //以下為連續采集部分的顯示
 63                void* pRaw8Buffer = NULL;
 64                pRaw8Buffer = objImageDataPointer->ConvertToRaw8(GX_BIT_0_7);
 65                std::memcpy(CamUiPtr->CurImgMat.data, pRaw8Buffer, (objImageDataPointer->GetHeight())*(objImageDataPointer->GetWidth()));
 66                //cv::flip(CamUiPtr->CurImgMat, CamUiPtr->CurImgMat, 0);//大恆的圖像要進行翻轉,但是此處似乎不需要翻轉
 67 
 68                //調用自定義繪圖函數進行繪制實時采集圖像
 69                CamUiPtr->ShowCurImgInLabel(CamUiPtr->LabelShowCurImg,CamUiPtr->CurImgMat);
 70 
 71                //重新調整圖像大小以適應窗口,並且此處進行了數據更新,這樣才能使用update()函數
 72                //使用drawimage進行繪圖的代碼
 73                //先得到一張完整的qimage,然后根據窗口進行修改qimage的大小,最后再進行更新。更行時需要對窗口進行提升,使用自定義窗口。
 74                //使用update進行畫圖有更好的連續性效果
 75                //CamUiPtr->CurImgQimg=CV2QTFORMAT::cvMatToQImage(CamUiPtr->CurImgMat);
 76                //CamUiPtr->pDrawWidget->ReSizeImg(CamUiPtr->CurImgQimg);
 77                //CamUiPtr->pDrawWidget->update();
 78 
 79                //單幀采集
 80                if(CamUiPtr->m_bCheckSaveBmp==true){
 81                    MakeMyDirectory(CamUiPtr->strFilePath);//創建文件夾
 82                    std::string PathAndName=CamUiPtr->strFilePath+"\\"+CamUiPtr->strFileName;
 83                    CamUiPtr->m_pBitmap->SaveBmp(objImageDataPointer,PathAndName);//保存單幀圖像
 84                    CamUiPtr->m_bCheckSaveBmp=false;
 85 
 86                    //通過讀取的方式畫出單幀圖像
 87                    QString LoadImgName=QString::fromStdString(PathAndName);
 88                    CamUiPtr->SingleImgPixMap.load(LoadImgName,nullptr,Qt::AutoColor);
 89                    CamUiPtr->LabelSingleImg->setPixmap(CamUiPtr->SingleImgPixMap);
 90 
 91                    //僅僅在激發采集的時候是有意義的
 92                    CamUiPtr->TimeTakePhoto=clock();
 93                    qDebug()<<(double)(CamUiPtr->TimeTakePhoto-CamUiPtr->TimePushButton);
 94                    CamUiPtr->TimePushButton=0;
 95                    CamUiPtr->TimeTakePhoto=0;
 96                }
 97             }
 98        }
 99      };
100 
101 
102 public:
103     explicit CameraWindow(QWidget *parent = 0);
104     ~CameraWindow();
105 
106     void CamWinParamsSet(int _WidgetW, int _WidgetH, int _SmallPartW, int _SmallPartH);
107 
108 private slots:
109     void on_pushButton_ListDevice_clicked();
110 
111     void on_pushButton_OpenCam_clicked();
112 
113     void on_pushButton_CloseCam_clicked();
114 
115     void on_pushButton_StartGrab_clicked();
116 
117     void on_pushButton_StopGrab_clicked();
118 
119     void on_pushButton_GetImg_clicked();
120     
121     void on_pushButton_ParamsSet_clicked();
122     
123 private:
124     Ui::CameraWindow *ui;
125     CameraWindowGeoParams CwParas;
126     //相機庫
127     GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;//枚舉設備結果
128     CGXDevicePointer ObjDevicePtr;//當前界面操作的相機指針
129     CGXStreamPointer ObjStreamPtr;//流采集指針
130     CGXFeatureControlPointer ObjFeatureControlPtr;//遠端設備控制器
131     ICaptureEventHandler* pCaptureEventHandler;//注冊回調事件指針
132 
133     //Opencv參數
134     cv::Mat CurImgMat;//實時窗口的Mat
135     void AllocateRoomForMatCurImgPtr();//為實時采集窗口指針分配空間
136 
137     //這里使用string,然后使用自定義函數進行轉換,放棄了MFC的CString類
138     std::string strFilePath;//保存路徑
139     std::string strFileName;//文件名稱
140 
141     // 保存圖像為BMP格式
142     CGXBitmap*  m_pBitmap;// 保存圖像指針
143     bool m_bCheckSaveBmp;// 是否保存圖片
144     int ImgWidth;//記錄圖片的寬度
145     int ImgHeight;//記錄圖片的高度
146 
147     //展示窗口指針
148     QLabel* LabelShowCurImg;
149     QLabel* LabelSingleImg;
150     QPixmap SingleImgPixMap;
151     QPixmap CurImgPixMap;//畫一個當前的圖
152     DrawWidget* pDrawWidget;//提升窗口指針,使用drawqimage顯示實時圖像
153 
154     //使用Painter事件來繪圖drawQimg
155     QImage CurImgQimg;
156     QSize LableSize;
157 
158     //計時函數
159     clock_t TimePushButton;
160     clock_t TimeTakePhoto;
161     double DelayTime;//用於后期設定延時時間
162 
163     //窗口幾何參數設計
164     void GeoSetWidgetCurInput(int _x, int _y, int _width, int _height);//設置實時采集框幾何尺寸
165     void GeoSetWidgetSampleImg(int _x, int _y, int _width, int _height);//設置單幀采集幾何尺寸
166     void GeoSetFrameParamsSet(int _x, int _y, int _width, int _height, int _dx, int _dy);//設置參數框幾何尺寸
167     void GeoSetFrameCamOperate();//設置操作框幾何尺寸
168     void GeoSetFrameWinInfo();//設置抬頭框幾何尺寸
169 
170     //繪制實時采集圖像成比例
171     void ShowCurImgInLabel(QLabel* ptrLabelToShow,cv::Mat& CVMat);
172 };
173 
174 #endif // CAMERAWINDOW_H

 

cgxbitmap.h

 1 #ifndef CGXBITMAP_H
 2 #define CGXBITMAP_H
 3 
 4 //------------------------------------------------------------------------
 5 /*
 6 \file        GXBitmap.h
 7 \brief        此類主要用於圖像的顯示和存儲,圖像顯示和存儲可以自適應黑白彩色相機,
 8 圖像存儲可以存儲為Bmp、Raw,對圖像顯示和存儲進行了聲明
 9 */
10 //------------------------------------------------------------------------
11 #include "GalaxyIncludes.h"
12 #include "convertstring.h"
13 class CGXBitmap
14 {
15 public:
16     //構造函數
17     CGXBitmap(CGXDevicePointer& objCGXDevicePointer);
18 
19     //析構函數
20     ~CGXBitmap(void);
21 
22      //顯示圖像
23      void Show(CImageDataPointer& objCImageDataPointer);
24 
25      //顯示圖像及幀率
26      void Show(CImageDataPointer& objCImageDataPointer,char* strDeviceSNFPS);
27 
28      //圖像處理后並顯示圖像
29      void ShowImageProcess(CImageProcessConfigPointer& objCfg,CImageDataPointer& objCImageDataPointer);
30 
31      // 存儲Bmp圖像
32      void SaveBmp(CImageDataPointer& objCImageDataPointer,const std::string& strFilePath);
33 
34      // 存儲Raw圖像
35      void SaveRaw(CImageDataPointer& objCImageDataPointer,const std::string& strFilePath);
36 
37      //通過GX_PIXEL_FORMAT_ENTRY獲取最優Bit位
38      GX_VALID_BIT_LIST GetBestValudBit(GX_PIXEL_FORMAT_ENTRY emPixelFormatEntry);
39 private:
40     //判斷PixelFormat是否為8位
41     bool __IsPixelFormat8(GX_PIXEL_FORMAT_ENTRY emPixelFormatEntry);
42 
43     //為彩色相機圖像顯示准備資源
44     void __ColorPrepareForShowImg();
45 
46     //為黑白相機圖像顯示准備資源
47     void __MonoPrepareForShowImg();
48 
49     //判斷是否兼容
50     bool __IsCompatible(BITMAPINFO *pBmpInfo, uint64_t nWidth, uint64_t nHeight);
51 
52     //更新Bitmap的信息
53     void __UpdateBitmap(CImageDataPointer& objCImageDataPointer);
54 
55     //將m_pBufferRGB中圖像顯示到界面
56     void __DrawImg(BYTE* pBuffer);
57 
58     //將m_pBufferRGB中圖像和幀率顯示到界面
59     void __DrawImg(BYTE* pBuffer, char* strDeviceSNFPS);
60 
61     //計算寬度所占的字節數
62     int64_t __GetStride(int64_t nWidth, bool bIsColor);
63 
64 
65 private:
66     //CameraWindow*      pCamw;                           //<顯示圖像窗口(控件)指針
67     bool               m_bIsColor ;                      //<是否支持彩色相機
68     int64_t            m_nImageHeight;                   //<原始圖像高
69     int64_t            m_nImageWidth;                    //<原始圖像寬
70     BITMAPINFO         *m_pBmpInfo;                         //<BITMAPINFO 結構指針,顯示圖像時使用
71     char               m_chBmpBuf[2048];                 //<BIMTAPINFO 存儲緩沖區,m_pBmpInfo即指向此緩沖區
72     //這里的這個mfc繪圖句柄刪去
73     //HDC                m_hDC;                            //<繪制圖像DC句柄
74     BYTE               *m_pImageBuffer;                  //<保存翻轉后的圖像用於顯示
75 private:
76     CGXBitmap& operator=(const CGXBitmap&);
77     CGXBitmap(const CGXBitmap&);
78 };
79 
80 #endif // CGXBITMAP_H

.......

 

qcustomplot.cpp

文件下載

鏈接:https://pan.baidu.com/s/1RqvkmACFslQxbHzkkihV_g
提取碼:o09o


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM