Я разработал инструмент калибровки на QT для моей работы. У меня уже есть внутренние параметры для наших камер, и он определяет внешние параметры с помощью шахматной доски. Дело в том, что мой босс хотел бы добавить возможность показывать 3D-модель рядом со столом, где находится шахматная доска, когда она обнаружена. Я использую виджет OpenCV для потоковой передачи, но я не знаю, как показать поток вместе с 3D-моделью, принимая во внимание внешние особенности.
Пока мне удалось это сделать:
void camCalibration::startVisualisationAR()
{
this->initializeVisualizers();
this->loadXraydevice();
//! Wait to get initial data
boost::posix_time::milliseconds waiting_for_data(100);
boost::this_thread::sleep(waiting_for_data);
int count=0;
while( m_ARVisuStarted )
{
//! Get color imgs from shared buffer and show it
for( int dIdx = 0; dIdx < m_numCameras; dIdx++)
{
//! Color current color
m_sharedDataMutexes[dIdx]->lock();
m_colorImagesLocal[ dIdx ] = m_imagesPerCamera[dIdx][0]->clone();
m_sharedDataMutexes[ dIdx ]->unlock();
if( m_colorImagesLocal[ dIdx ].rows != 0)
{
if( xaware_demo_utils::openCV2VTK( m_colorImagesLocal[ dIdx ], m_colorImagesData[ dIdx ] ))
{
m_colorImagesData[ dIdx ]->Modified();
m_colorImagesActor[ dIdx ]->SetInput( m_colorImagesData[ dIdx ] );
m_colorImagesActor[ dIdx ]->SetOpacity(1);
//m_virtualImagesActor[ dIdx ]->SetInput( m_virtualImagesData[ dIdx ] );
if(count < m_numCameras)
{
m_xRayDevice_renderers[ dIdx ]->AddActor( m_colorImagesActor[ dIdx ] );
m_xRayDevice_renderers[ dIdx ]->AddActor( m_xRayDevice_actor );
vtkSmartPointer<vtkCamera> camera = m_xRayDevice_renderers[ dIdx ]->GetActiveCamera();
m_xRayDevice_renderers[ dIdx ]->ResetCamera();
camera->Zoom(1.7);
m_xRayDevice_renderWindows[ dIdx ]->Render();
count++;
}
//! Get output AR image in CV format
vtkSmartPointer<vtkImageData> ar_output = vtkSmartPointer<vtkImageData>::New();
ar_output = xaware_demo_utils::vtkWindowToImage( m_xRayDevice_renderWindows[ dIdx ]);
m_outputARImages[ dIdx ] = xaware_demo_utils::vtkToOpenCV( ar_output );
//! Convert color channels
cv::cvtColor( m_outputARImages[ dIdx ], m_outputARImages[ dIdx ], CV_BGRA2RGBA );
cv::cvtColor( m_outputARImages[ dIdx ], m_outputARImages[ dIdx ], CV_RGBA2RGB );
//! Sent AR images to GUI
m_sharedOutputDataMutexes[ dIdx ]->lock();
*m_outputSharedImages[ dIdx ] = m_outputARImages[ dIdx ].clone();
m_sharedOutputDataMutexes[ dIdx ]->unlock();
}
}
}
}
//! Release memory
this->closeRenderWindows();
}
Я не могу показать гораздо больше из соображений конфиденциальности.
Вот комната с шахматной доской, покаВыполнение калибровки:
Затем я использую флажок для активации визуализации AR. Сейчас я могу просто показать 3D-модель (рентгеновское устройство, которое я заменил хорошей статуей крокодила, чтобы избежать каких-либо проблем) рядом с входами камер:
Любая идеякак я могу ограничить просмотр рендера для актера, а не для обоих актеровА как настроить масштаб и положение громкости на изображении в зависимости от параметров камеры?