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