相機採集影象並顯示,程式流程圖,與程式設計例項
阿新 • • 發佈:2018-11-24
/*影象抓取執行緒,主動呼叫SDK介面函式獲取影象*/ UINT CBasicDlg::GrabThread() { tSdkFrameHead sFrameInfo; BYTE* pRawBuffer; // CameraSetTriggerMode(m_hCamera, 2);//設定相機硬體觸發模式 while (!m_bExit) { if (CameraGetImageBuffer(m_hCamera, &sFrameInfo, &pRawBuffer, 1000) == CAMERA_STATUS_SUCCESS) { MyRawImage* pNewImage = (MyRawImage*)malloc(sizeof(MyRawImage) + sFrameInfo.uBytes); if (pNewImage != NULL) { pNewImage->head = sFrameInfo; memcpy(pNewImage->buffer, pRawBuffer, sFrameInfo.uBytes); pNewImage->index = mySerialPort.cRecvednum; } CameraReleaseImageBuffer(m_hCamera, pRawBuffer); if (pNewImage != NULL) { m_RawImageQL.Lock(); if (m_RawImageQ.size() < RAW_BUFFER_MAX_COUNT) m_RawImageQ.push_back(pNewImage); else free(pNewImage); m_RawImageQL.Unlock(); SetEvent(m_RawImageQE); } } } return 0; } UINT CBasicDlg::WorkThread() { MvTimer t; Mat BIGframe0; //const cv::Mat ComFrame = Mat::zeros(480 * 4, 640 * 18, CV_8UC1); //const cv::Mat ColorComFrame = Mat::zeros(480 * 4, 640 * 18, CV_8UC3); //cv::Mat MainWindows = Mat::zeros(300, 1800, CV_8UC1); //cv::Mat ColorMainWindows = Mat::zeros(300, 1800, CV_8UC3); const cv::Mat ComFrame(480 * 4, 640 * 18, CV_8UC1); const cv::Mat ColorComFrame(480 * 4, 640 * 18, CV_8UC3); cv::Mat MainWindows(300, 1800, CV_8UC1); cv::Mat ColorMainWindows(300, 1800, CV_8UC3); cv::Mat image1, image2; bool start = false; setMouseCallback("MainWindows", on_mouse, 0);//呼叫回撥函式 while (!m_bExit) { if (WaitForSingleObject(m_RawImageQE, 200) != WAIT_OBJECT_0) continue; for (;;) { std::vector<void*> RawImageQ; m_RawImageQL.Lock(); RawImageQ = m_RawImageQ; m_RawImageQ.clear(); m_RawImageQL.Unlock(); if (RawImageQ.empty()) break; for (size_t i = 0; i < RawImageQ.size(); ++i) { MyRawImage* pNewImage = (MyRawImage*)RawImageQ[i]; index = pNewImage->index; if (index) { if (index == 1) { start = true; } if (start) { Mat image(pNewImage->head.iHeight, pNewImage->head.iWidth, CV_8UC1); Mat resImage(600, 800, CV_8UC1); memcpy(image.data, pNewImage->buffer, pNewImage->head.iHeight* pNewImage->head.iWidth); cv::resize(image, resImage, cv::Size(800, 600), 0, 0, INTER_NEAREST); flip(resImage, resImage, -1); //水平垂直翻轉 //ImageStitch(index, image1, resImage, ComFrame); //cv::resize(ComFrame, MainWindows, Size(1800, 300), 0, 0, INTER_NEAREST); //imshow("MainWindows", MainWindows); ImageStitch(index, image1, resImage, ColorComFrame); cv::resize(ColorComFrame, ColorMainWindows, Size(1800, 300), 0, 0, INTER_NEAREST); imshow("MainWindows", ColorMainWindows); free(pNewImage); //測試用 ////解析度改變了,則重新整理背景 //if (m_sFrInfo.iWidth != pNewImage->head.iWidth || m_sFrInfo.iHeight != pNewImage->head.iHeight) //{ //m_sFrInfo.iWidth = pNewImage->head.iWidth; //m_sFrInfo.iHeight = pNewImage->head.iHeight; //InvalidateRect(NULL); //} m_iDispFrameNum++; if (flag) { //dst = ComFrame(Rect((int)(min(cur_pt.x, pre_pt.x)*6.4), (int)(min(cur_pt.y, pre_pt.y)*6.4), width, height)); dst = ColorComFrame(Rect((int)(min(cur_pt.x, pre_pt.x)*6.4), (int)(min(cur_pt.y, pre_pt.y)*6.4), width, height)); imshow("view", dst); } } } } } } return 0; }