簡體   English   中英

相機崩潰后“節點不可寫”異常

[英]"Node is not writable" exception after a camera crash

我正在使用 Spinnaker SDK 來控制 FLIR 相機。 如果在任何時候應用程序因使用相機而崩潰,應用程序的每次執行都會拋出AccessException ,例如:

Spinnaker::GenApi::CommandNode::Execute: Message = GenICam::AccessException= 節點不可寫。 :調用“UserSetLoad.Execute()”時在節點“UserSetLoad”中拋出 AccessException

到目前為止,我找到的唯一解決方案是拔下並插入相機,但在將要使用應用程序的某些環境中,這不是可接受的解決方案。

這里是一個示例代碼(不能完全編譯,因為它是從更大的代碼庫中提取的,但讓您了解工作流程):

// System instance is prepared before using the camera
Spinnaker::SystemPtr m_system = Spinnaker::System::GetInstance();

// Method in class that initializes the camera 
bool initCamera(int index)
{
  SmartCameraList cameras(m_system->GetCameras());

  const auto cameras_count = cameras.GetSize();
  if (cameras_count < 1) { return false; }

  if (index >= (int)cameras_count) { return false; }

  m_camera = cameras[index];

  if (!m_camera) { return false; }

  if (m_camera->IsInitialized()) { return false; } // passes
  m_camera->DeInit(); // does nothing
  m_camera->Init();
  if (!m_camera->IsInitialized()) { return false; } // passes

  // Default properties
  try {
    m_camera->UserSetSelector.SetValue(UserSetSelector_Default);
    m_camera->UserSetDefault.SetValue(UserSetDefault_Default);
    m_camera->UserSetLoad.Execute(); //< thrown here

    m_camera->BalanceWhiteAuto.SetValue(BalanceWhiteAuto_Continuous);
    m_camera->SensorShutterMode.SetValue(SensorShutterMode_Global);
  } catch (Spinnaker::Exception e) {
    std::cout << e.GetFullErrorMessage() << '\n';
    return false;
  }

  return true;
}

// m_system->ReleaseInstance() is called when the application finishes using the camera

如您所見,相機已正確初始化,但似乎有其他東西在握住相機。

我查看了官方論壇,尋找更通用的GenICam相關問題,但一無所獲。

有什么辦法可以在使用前重置相機嗎?

我通過明智地連接和斷開相機 SW 解決了這個問題。

通過在單獨的線程中啟動以下代碼來開始捕獲:


void Cam::MainThread(){
    m_cameraHandler->BeginAcquisition();
    while(m_threadCtx.wait(ZERO_DURATION)){ //sleepwait
        try {

            ImagePtr pResultImage = m_cameraHandler->GetNextImage(1000);
            const size_t width = pResultImage->GetWidth();
            const size_t height = pResultImage->GetHeight();

            cv::Mat_<uint16_t> img(height,width);
            memcpy(img.data,pResultImage->GetData(),pResultImage->GetWidth()*pResultImage->GetHeight()*sizeof(uint16_t));
                        
            if (pResultImage->IsIncomplete())
                cout << "Error";
            else {
                pResultImage->Release();
            }
        }
        catch (Spinnaker::Exception& e)
        {
            CLerror << "Error: " << e.what();
        }
    }
}

然后停止相機

    m_threadCtx.stop();
    m_pMainThread->join();
    m_cameraHandler->EndAcquisition();
    m_cameraHandler->DeInit();
    m_cameraHandler = nullptr;
    m_spCameraList = nullptr;

    delete(m_pMainThread);

之后,您可以打開相機並再次上傳文件,它應該可以工作。

為我工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM