#include "ToolDialog.h" #include #include #include #include #include ToolDialogImpl::ToolDialogImpl(QWidget* parent, DllTool* pDllTool) : DllToolDialog(parent) { ui.setupUi(this); this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/); connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI())); // 显示控件初始化 hwndUnit = new HWndUnit(this); Util::ShowUnitInWidget(ui.Image_widget, hwndUnit); for (int i = 0; i < 256; i++) { grayColourTable.append(qRgb(i, i, i)); } int dataSize = 400 * 300 * 3; m_data.reset(new uchar[dataSize], std::default_delete()); int iCameraCounts = 4; int iStatus = -1; tSdkCameraDevInfo tCameraEnumList[4]; //sdk初始化 0 English 1中文 CameraSdkInit(1); //枚举设备,并建立设备列表 CameraEnumerateDevice(tCameraEnumList, &iCameraCounts); Initialize(0, ""); } ToolDialogImpl::~ToolDialogImpl() { } VPEnum::RETURN_VALUE ToolDialogImpl::Execute() { try { hwndUnit->ShowImage(m_Image); hwndUnit->Refresh(); } catch (...) { qWarning() << "Execute() Error"; } emit sigUpdateUI(); return VPEnum::RETURN_VALUE::Success; } /// /// /// /// void ToolDialogImpl::Running(bool bRun) { } /// /// /// /// /// /// bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut) { int paranum;//参数数量 if (bIsOut)//保存参数流程 { paranum = 1; ar << paranum;//先保存参数数量 ar << (int)1 << m_Image; } else//加载参数流程,参数加载顺序一定要跟保存顺序一致 { int nSize1 = 0; int para; ar >> paranum;//读取参数数量 for (int i = 0; i < paranum; i++) { ar >> para; switch (para) { case 1: ar >> m_Image; break; default: { qWarning() << "Serialized(In) Error" ; return false; } break; } } } return true; } void ToolDialogImpl::on_UpdateUI() { } /// /// 确定 /// void ToolDialogImpl::on_btnOK_clicked() { this->hide(); } /// /// 取消按钮 /// void ToolDialogImpl::on_btnCancel_clicked() { // 将本工具的恢复到打开工具之前的状态 RecoverData(); } /// /// 测试按钮 /// void ToolDialogImpl::on_btnExecute_clicked() { QElapsedTimer toolTimer; toolTimer.start(); // 发送事件 ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER); QCoreApplication::sendEvent(m_pEventTarget, pToolEvent); // 统计返回值 VPEnum::RETURN_VALUE ret = pToolEvent->ret; double nExecTime = toolTimer.elapsed(); QString str; str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5); ui.label_time->setText(str); str = QString("状态: %1 ").arg(QMetaEnum::fromType().key((short)ret)); ui.label_state->setText(str); delete pToolEvent; } ////////////////////////////////////////////////////////////////////////// void ToolDialogImpl::getDevices(tSdkCameraDevInfo** devices, int& count, bool redo) { const int maxNum = 20; static tSdkCameraDevInfo tCameraEnumList[maxNum]; static int counts(0); if (redo || counts <= 0) { static bool bSdkOk(false); if (!bSdkOk) //sdk初始化 0 English 1中文 bSdkOk = CameraSdkInit(1) == CAMERA_STATUS_SUCCESS; int iCameraCounts(maxNum); CameraEnumerateDevice(tCameraEnumList, &iCameraCounts); counts = iCameraCounts; } *devices = tCameraEnumList; count = counts; } bool ToolDialogImpl::Initialize(int DeviceNumber, QString varParamPath) { tSdkCameraDevInfo* tCameraEnumList(Q_NULLPTR); int count(0); getDevices(&tCameraEnumList, count); int iStatus = -1; //相机初始化。初始化成功后,才能调用任何其他相机相关的操作接口 iStatus = CameraInit(&tCameraEnumList[DeviceNumber], PARAM_MODE_BY_SN, -1, &m_hCamera); //初始化失败 if (iStatus != CAMERA_STATUS_SUCCESS) { return false; } //获得相机的特性描述结构体。该结构体中包含了相机可设置的各种参数的范围信息。决定了相关函数的参数 CameraGetCapability(m_hCamera, &m_sCameraInfo); /* 设置图像处理的输出格式,彩色黑白都支持RGB24位 */ //相机参数的raw2rgb主要有A1、A3两种算法,默认输出BGR //CameraImageProcess负责将raw转换成rgb,而算法A1只支持BGR,算法A3 可以在设置CameraSetIspOutFormat成格式RGB 的时候可以输出 RGB if (m_sCameraInfo.sIspCapacity.bMonoSensor) { CameraSetIspOutFormat(m_hCamera, CAMERA_MEDIA_TYPE_MONO8); } else { //CameraSetIspOutFormat(m_hCamera,/*CAMERA_MEDIA_TYPE_RGB8*/CAMERA_MEDIA_TYPE_BGR8); } CameraSetMirror(m_hCamera, MIRROR_DIRECTION_VERTICAL, true); CameraSetCallbackFunction(m_hCamera, &ToolDialogImpl::GrabImageCallback, (PVOID)this, nullptr); CameraPlay(m_hCamera); return true; } /** * @brief QImage2HImage 将 Qt QImage 转换为 Halcon 的 HImage * @param from 输入的 QImage * @param to 输出的 HImage ,from 和 to 不共享内存数据。 每次都会为 to 重新分配内存。 * @return true 表示转换成功,false 表示转换失败。 */ bool QImage2HImage(QImage& from, HalconCpp::HImage& to) { if (from.isNull()) return false; int width = from.width(), height = from.height(); QImage::Format format = from.format(); if (format == QImage::Format_RGB32 || format == QImage::Format_ARGB32 || format == QImage::Format_ARGB32_Premultiplied) { to.GenImageInterleaved(from.bits(), "rgbx", width, height, 0, "byte", width, height, 0, 0, 8, 0); return true; } else if (format == QImage::Format_RGB888) { to.GenImageInterleaved(from.bits(), "rgb", width, height, 0, "byte", width, height, 0, 0, 8, 0); return true; } else if (format == QImage::Format_Grayscale8 || format == QImage::Format_Indexed8) { to.GenImage1("byte", width, height, from.bits()); return true; } return false; } void ToolDialogImpl:: GrabImageCallback(CameraHandle hCamera, BYTE* pFrameBuffer, tSdkFrameHead* pFrameHead, PVOID pContext) { CameraSdkStatus status; ToolDialogImpl* pThis = (ToolDialogImpl*)pContext; //将获得的原始数据转换成RGB格式的数据,同时经过ISP模块,对图像进行降噪,边沿提升,颜色校正等处理。 //我公司大部分型号的相机,原始数据都是Bayer格式的 status = CameraImageProcess(pThis->m_hCamera, pFrameBuffer, pThis->m_data.get(), pFrameHead); //在成功调用CameraGetImageBuffer后,必须调用CameraReleaseImageBuffer来释放获得的buffer。 //否则再次调用CameraGetImageBuffer时,程序将被挂起,知道其他线程中调用CameraReleaseImageBuffer来释放了buffer CameraReleaseImageBuffer(pThis->m_hCamera, pFrameBuffer); // TODOLINLIN copy line by line const int width(pFrameHead->iWidth), height(pFrameHead->iHeight); // int dataSize(width * height); // int bytesPerLine(width); QImage::Format imgFmt = QImage::Format_Indexed8; if (pFrameHead->uiMediaType != CAMERA_MEDIA_TYPE_MONO8) { // dataSize = width * height * 3; // bytesPerLine = width * 3; imgFmt = QImage::Format_RGB888; } // GenImage3(&pThis->m_Image, "byte", width, height, (Hlong)pThis->m_data.get() ,); // pThis->hwndUnit->ShowImage(pThis->m_Image); // pThis->hwndUnit->Refresh(); // return; QImage img(pThis->m_data.get(), width, height, imgFmt); if (pFrameHead->uiMediaType == CAMERA_MEDIA_TYPE_MONO8) { img.setColorTable(pThis->grayColourTable); } //img.save("./123.png"); QImage2HImage(img, pThis->m_Image); pThis->hwndUnit->ShowImage(pThis->m_Image); pThis->hwndUnit->Refresh(); }