160 lines
3.3 KiB
C++
160 lines
3.3 KiB
C++
|
#include "app.h"
|
||
|
#include "util.h"
|
||
|
|
||
|
#include <thread>
|
||
|
#include <chrono>
|
||
|
|
||
|
// Constructor
|
||
|
Kinect::Kinect()
|
||
|
{
|
||
|
// Initialize
|
||
|
initialize();
|
||
|
}
|
||
|
|
||
|
// Destructor
|
||
|
Kinect::~Kinect()
|
||
|
{
|
||
|
// Finalize
|
||
|
finalize();
|
||
|
}
|
||
|
|
||
|
// Processing
|
||
|
void Kinect::run()
|
||
|
{
|
||
|
// Main Loop
|
||
|
while( true ){
|
||
|
// Update Data
|
||
|
update();
|
||
|
|
||
|
// Draw Data
|
||
|
draw();
|
||
|
|
||
|
// Show Data
|
||
|
show();
|
||
|
|
||
|
// Key Check
|
||
|
const int key = cv::waitKey( 10 );
|
||
|
if( key == VK_ESCAPE ){
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Initialize
|
||
|
void Kinect::initialize()
|
||
|
{
|
||
|
cv::setUseOptimized( true );
|
||
|
|
||
|
// Initialize Sensor
|
||
|
initializeSensor();
|
||
|
|
||
|
// Initialize Color
|
||
|
initializeColor();
|
||
|
|
||
|
// Wait a Few Seconds until begins to Retrieve Data from Sensor ( about 2000-[ms] )
|
||
|
std::this_thread::sleep_for( std::chrono::seconds( 2 ) );
|
||
|
}
|
||
|
|
||
|
// Initialize Sensor
|
||
|
inline void Kinect::initializeSensor()
|
||
|
{
|
||
|
// Open Sensor
|
||
|
ERROR_CHECK( GetDefaultKinectSensor( &kinect ) );
|
||
|
|
||
|
ERROR_CHECK( kinect->Open() );
|
||
|
|
||
|
// Check Open
|
||
|
BOOLEAN isOpen = FALSE;
|
||
|
ERROR_CHECK( kinect->get_IsOpen( &isOpen ) );
|
||
|
if( !isOpen ){
|
||
|
throw std::runtime_error( "failed IKinectSensor::get_IsOpen( &isOpen )" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Initialize Color
|
||
|
inline void Kinect::initializeColor()
|
||
|
{
|
||
|
// Open Color Reader
|
||
|
ComPtr<IColorFrameSource> colorFrameSource;
|
||
|
ERROR_CHECK( kinect->get_ColorFrameSource( &colorFrameSource ) );
|
||
|
ERROR_CHECK( colorFrameSource->OpenReader( &colorFrameReader ) );
|
||
|
|
||
|
// Retrieve Color Description
|
||
|
ComPtr<IFrameDescription> colorFrameDescription;
|
||
|
ERROR_CHECK( colorFrameSource->CreateFrameDescription( ColorImageFormat::ColorImageFormat_Bgra, &colorFrameDescription ) );
|
||
|
ERROR_CHECK( colorFrameDescription->get_Width( &colorWidth ) ); // 1920
|
||
|
ERROR_CHECK( colorFrameDescription->get_Height( &colorHeight ) ); // 1080
|
||
|
ERROR_CHECK( colorFrameDescription->get_BytesPerPixel( &colorBytesPerPixel ) ); // 4
|
||
|
|
||
|
// Allocation Color Buffer
|
||
|
colorBuffer.resize( colorWidth * colorHeight * colorBytesPerPixel );
|
||
|
}
|
||
|
|
||
|
// Finalize
|
||
|
void Kinect::finalize()
|
||
|
{
|
||
|
cv::destroyAllWindows();
|
||
|
|
||
|
// Close Sensor
|
||
|
if( kinect != nullptr ){
|
||
|
kinect->Close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Update Data
|
||
|
void Kinect::update()
|
||
|
{
|
||
|
// Update Color
|
||
|
updateColor();
|
||
|
}
|
||
|
|
||
|
// Update Color
|
||
|
inline void Kinect::updateColor()
|
||
|
{
|
||
|
// Retrieve Color Frame
|
||
|
ComPtr<IColorFrame> colorFrame;
|
||
|
const HRESULT ret = colorFrameReader->AcquireLatestFrame( &colorFrame );
|
||
|
if( FAILED( ret ) ){
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Convert Format ( YUY2 -> BGRA )
|
||
|
ERROR_CHECK( colorFrame->CopyConvertedFrameDataToArray( static_cast<UINT>( colorBuffer.size() ), &colorBuffer[0], ColorImageFormat::ColorImageFormat_Bgra ) );
|
||
|
}
|
||
|
|
||
|
// Draw Data
|
||
|
void Kinect::draw()
|
||
|
{
|
||
|
// Draw Color
|
||
|
drawColor();
|
||
|
}
|
||
|
|
||
|
// Draw Color
|
||
|
inline void Kinect::drawColor()
|
||
|
{
|
||
|
// Create cv::Mat from Color Buffer
|
||
|
colorMat = cv::Mat( colorHeight, colorWidth, CV_8UC4, &colorBuffer[0] );
|
||
|
}
|
||
|
|
||
|
// Show Data
|
||
|
void Kinect::show()
|
||
|
{
|
||
|
// Show Color
|
||
|
showColor();
|
||
|
}
|
||
|
|
||
|
// Show Color
|
||
|
inline void Kinect::showColor()
|
||
|
{
|
||
|
if( colorMat.empty() ){
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Resize Image
|
||
|
cv::Mat resizeMat;
|
||
|
const double scale = 0.5;
|
||
|
cv::resize( colorMat, resizeMat, cv::Size(), scale, scale );
|
||
|
|
||
|
// Show Image
|
||
|
cv::imshow( "Color", resizeMat );
|
||
|
}
|