#include <QFileDialog>
#include <QGraphicsPixmapItem>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "capturethread.h"
#include <stdio.h>
#ifdef _WIN64
#pragma comment(lib,"MVCAMSDK_X64.lib")
#else
#pragma comment(lib,"MVCAMSDK.lib")
#endif // _WIN64
//SDK
int g_hCamera = -1; //设备句柄
unsigned char * g_pRawBuffer = NULL; //raw数据
unsigned char * g_pRgbBuffer = NULL; //处理后数据缓存区
tSdkFrameHead g_tFrameHead; //图像帧头信息
tSdkCameraCapbility g_tCapability; //设备描述信息
int g_SaveParameter_num = 0; //保存参数组
int g_SaveImage_type = 0; //保存图像格式
Width_Height g_W_H_INFO; //显示画板到大小和图像大小
BYTE *g_readBuf = NULL; //画板显示数据区
int g_read_fps = 0; //统计读取帧率
int g_disply_fps = 0; //统计显示帧率
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow), m_scene(0), m_image_item(0)
{
if (init_SDK() == -1){
status = 0;
}
ui->setupUi(this);
m_scene = new QGraphicsScene(this);
ui->graphicsView->setScene(m_scene);
m_timer = new QTimer(this);
//connect(m_timer, SIGNAL(timeout()), this, SLOT(camera_statues()));
m_timer->start(1000);
m_thread = new CaptureThread(this);
//qDebug() << m_thread;//检测是否创建线程
connect(m_thread, SIGNAL(captured(QImage)), this, SLOT(Image_process(QImage)), Qt::BlockingQueuedConnection);
//m_camera_statuesFps = new QLabel(this);
//m_camera_statuesFps->setAlignment(Qt::AlignHCenter);
//ui->statusBar->addWidget(m_camera_statuesFps);
//GUI_init_Resolution(g_hCamera, &g_tCapability);
//GUI_init_speed(g_hCamera, &g_tCapability);
//GUI_init_parameter(g_hCamera, &g_tCapability);
init_Camera();
set_Resolution();
//m_thread->start();
//m_thread->stream();
//status = 1;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::closeEvent(QCloseEvent *e)
{
m_thread->stop();
while (!m_thread->wait(100))
{
QCoreApplication::processEvents();
}
if (g_readBuf != NULL){
free(g_readBuf);
g_readBuf = NULL;
}
if (g_pRgbBuffer != NULL){
free(g_pRgbBuffer);
g_pRgbBuffer = NULL;
}
if (g_hCamera > 0){
//相机反初始化。释放资源。
CameraUnInit(g_hCamera);
g_hCamera = -1;
}
QMainWindow::closeEvent(e);
}
void MainWindow::Image_process(QImage img)
{
if (m_thread->quit)
{
return;
}
if (m_image_item)
{
m_scene->removeItem(m_image_item);
delete m_image_item;
m_image_item = 0;
}
m_image_item = m_scene->addPixmap(QPixmap::fromImage(img));
m_scene->setSceneRect(0, 0, img.width(), img.height());
//m_scene->setSceneRect(0, 0, 800, 600);
g_disply_fps++;
}
int MainWindow::init_SDK()
{
int iCameraCounts = 4;
int iStatus = -1;
tSdkCameraDevInfo tCameraEnumList[4];
//sdk初始化 0 English 1中文
CameraSdkInit(1);
//枚举设备,并建立设备列表
CameraEnumerateDevice(tCameraEnumList, &iCameraCounts);
//没有连接设备
if (iCameraCounts == 0){
return -1;
}
//相机初始化。初始化成功后,才能调用任何其他相机相关的操作接口
iStatus = CameraInit(&tCameraEnumList[0], -1, -1, &g_hCamera);
//初始化失败
if (iStatus != CAMERA_STATUS_SUCCESS){
return -1;
}
//获得相机的特性描述结构体。该结构体中包含了相机可设置的各种参数的范围信息。决定了相关函数的参数
CameraGetCapability(g_hCamera, &g_tCapability);
g_pRgbBuffer = (unsigned char*)malloc(g_tCapability.sResolutionRange.iHeightMax*g_tCapability.sResolutionRange.iWidthMax * 3);
g_readBuf = (unsigned char*)malloc(g_tCapability.sResolutionRange.iHeightMax*g_tCapability.sResolutionRange.iWidthMax * 3);
/*让SDK进入工作模式,开始接收来自相机发送的图像
数据。如果当前相机是触发模式,则需要接收到
触发帧以后才会更新图像。 */
CameraPlay(g_hCamera);
/*
设置图像处理的输出格式,彩色黑白都支持RGB24位
*/
if (g_tCapability.sIspCapacity.bMonoSensor){
CameraSetIspOutFormat(g_hCamera, CAMERA_MEDIA_TYPE_MONO8);
}
else{
CameraSetIspOutFormat(g_hCamera, CAMERA_MEDIA_TYPE_RGB8);
}
return 0;
}
void MainWindow::set_Resolution()
{
tSdkImageResolution *pImageSizeDesc = g_tCapability.pImageSizeDesc;// 预设分辨率选择
//pImageSizeDesc->iIndex = 0xff;
//pImageSizeDesc->iHeightFOV = 1200;
//pImageSizeDesc->iWidthFOV = 1600;
//g_W_H_INFO.sensor_width = pImageSizeDesc->iWidth = 1600;
//g_W_H_INFO.sensor_height = pImageSizeDesc->iHeight = 1200;
//m_thread->pause();
//CameraSetImageResolution(g_hCamera, pImageSizeDesc);
//m_thread->stream();
int index = 9;
//pImageSizeDesc[index].iHeightZoomSw = 1;
//pImageSizeDesc[index].iWidthZoomSw = 1;
g_W_H_INFO.sensor_width = pImageSizeDesc[index].iWidth;
g_W_H_INFO.sensor_height = pImageSizeDesc[index].iHeight;
g_W_H_INFO.buffer_size = g_W_H_INFO.sensor_width*g_W_H_INFO.sensor_height;
pImageSizeDesc[index].iWidthZoomSw=551;
pImageSizeDesc[index].iHeightZoomSw=401;
if (pImageSizeDesc[index].iWidthZoomSw){
g_W_H_INFO.sensor_width = pImageSizeDesc[index].iWidthZoomSw;
g_W_H_INFO.sensor_height = pImageSizeDesc[index].iHeightZoomSw;
}
if (g_W_H_INFO.sensor_width < g_W_H_INFO.display_width){
g_W_H_INFO.xOffsetFOV = (g_W_H_INFO.display_width - g_W_H_INFO.sensor_width) / 2;
}
else{
g_W_H_INFO.xOffsetFOV = 0;
}
if (g_W_H_INFO.sensor_height < g_W_H_INFO.display_height){
g_W_H_INFO.yOffsetFOV = (g_W_H_INFO.display_height - g_W_H_INFO.sensor_height) / 2;
}
else{
g_W_H_INFO.yOffsetFOV = 0;
}
m_thread->pause();
CameraSetImageResolution(g_hCamera, &(pImageSizeDesc[index]));
m_thread->stream();
}
void MainWindow::set_exposuretime()
{
double pfExposureTime;
int pusAnalogGain;
double m_fExpLineTime = 0;
//设置相机的曝光时间
CameraGetExposureLineTime(g_hCamera, &m_fExpLineTime);
pfExposureTime = 60;
CameraSetExposureTime(g_hCamera,91395);
//设置图像信号的模拟增益值。
pusAnalogGain = 2;
CameraSetAnalogGain(g_hCamera, pusAnalogGain);
}
void MainWindow::init_Camera()
{
CameraSetTriggerMode(g_hCamera, 0);//设置连续采集模式
set_exposuretime();//设置曝光时间
CameraSetGamma(g_hCamera, 100);//设置GAMMA值
//CameraSetSaturation(g_hCamera, 100);
CameraSetContrast(g_hCamera, 100);//设置对比度
CameraSetSharpness(g_hCamera, 0);//锐化
CameraSetFrameSpeed(g_hCamera, 1);//设置中速速度模式
}
//通过打开线程打开相机
void MainWindow::on_pushButton_clicked()
{
m_thread->start();
m_thread->stream();
status = 1;
}
//捕获图片并保存
void MainWindow::on_pushButton_2_clicked()
{
tSdkFrameHead tFrameHead;
BYTE *pbyBuffer;
BYTE *pbImgBuffer;
char filename[512] = { 0 };
QString path = {".\\test\\"};
char* dir;
QByteArray tmp = path.toLatin1();
dir = tmp.data();
sprintf(filename, "%stest", dir);
if (CameraSnapToBuffer(g_hCamera, &tFrameHead, &pbyBuffer, 1000) == CAMERA_STATUS_SUCCESS)
{
g_SaveImage_type = 3;
switch (g_SaveImage_type){
case 1:
break;
case 2:
break;
case 3:
pbImgBuffer = (unsigned char*)malloc(g_tCapability.sResolutionRange.iHeightMax*g_tCapability.sResolutionRange.iWidthMax * 3);
/*
将获得的相机原始输出图像数据进行处理,叠加饱和度、
颜色增益和校正、降噪等处理效果,最后得到RGB888
格式的图像数据。
*/
CameraImageProcess(g_hCamera, pbyBuffer, pbImgBuffer, &tFrameHead);
//将图像缓冲区的数据保存成图片文件。
CameraSaveImage(g_hCamera, filename, pbImgBuffer, &tFrameHead, FILE_BMP, 100);
//释放由CameraGetImageBuffer获得的缓冲区。