前提・実現したいこと
OpenCVとOpenNIを使ってラズパイにつないだXtion PRO LIVEから映像を取得して、画面上に表示したいです。
発生している問題・エラーメッセージ
/tmp/ccdAqM55.o: 関数 `main' 内: Color_Stream.cpp:(.text+0x5c): `cv::waitKey(int)' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoFrameRef::release()' 内: Color_Stream.cpp:(.text._ZN6openni13VideoFrameRef7releaseEv[_ZN6openni13VideoFrameRef7releaseEv]+0x2c): `oniFrameRelease' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoStream::start()' 内: Color_Stream.cpp:(.text._ZN6openni11VideoStream5startEv[_ZN6openni11VideoStream5startEv]+0x40): `oniStreamStart' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoStream::readFrame(openni::VideoFrameRef*)' 内: Color_Stream.cpp:(.text._ZN6openni11VideoStream9readFrameEPNS_13VideoFrameRefE[_ZN6openni11VideoStream9readFrameEPNS_13VideoFrameRefE]+0x4c): `oniStreamReadFrame' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoStream::isPropertySupported(int) const' 内: Color_Stream.cpp:(.text._ZNK6openni11VideoStream19isPropertySupportedEi[_ZNK6openni11VideoStream19isPropertySupportedEi]+0x48): `oniStreamIsPropertySupported' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoStream::_setHandle(_OniStream*)' 内: Color_Stream.cpp:(.text._ZN6openni11VideoStream10_setHandleEP10_OniStream[_ZN6openni11VideoStream10_setHandleEP10_OniStream]+0x54): `oniStreamGetSensorInfo' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::Device::isPropertySupported(int) const' 内: Color_Stream.cpp:(.text._ZNK6openni6Device19isPropertySupportedEi[_ZNK6openni6Device19isPropertySupportedEi]+0x24): `oniDeviceIsPropertySupported' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::Device::isCommandSupported(int) const' 内: Color_Stream.cpp:(.text._ZNK6openni6Device18isCommandSupportedEi[_ZNK6openni6Device18isCommandSupportedEi]+0x24): `oniDeviceIsCommandSupported' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::OpenNI::initialize()' 内: Color_Stream.cpp:(.text._ZN6openni6OpenNI10initializeEv[_ZN6openni6OpenNI10initializeEv]+0xc): `oniInitialize' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::OpenNI::getExtendedError()' 内: Color_Stream.cpp:(.text._ZN6openni6OpenNI16getExtendedErrorEv[_ZN6openni6OpenNI16getExtendedErrorEv]+0x8): `oniGetExtendedError' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoStream::create(openni::Device const&, openni::SensorType)' 内: Color_Stream.cpp:(.text._ZN6openni11VideoStream6createERKNS_6DeviceENS_10SensorTypeE[_ZN6openni11VideoStream6createERKNS_6DeviceENS_10SensorTypeE]+0x2c): `oniDeviceCreateStream' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::VideoStream::destroy()' 内: Color_Stream.cpp:(.text._ZN6openni11VideoStream7destroyEv[_ZN6openni11VideoStream7destroyEv]+0x88): `oniStreamDestroy' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::Device::open(char const*)' 内: Color_Stream.cpp:(.text._ZN6openni6Device4openEPKc[_ZN6openni6Device4openEPKc]+0x5c): `oniDeviceOpen' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::Device::_setHandle(_OniDevice*)' 内: Color_Stream.cpp:(.text._ZN6openni6Device10_setHandleEP10_OniDevice[_ZN6openni6Device10_setHandleEP10_OniDevice]+0x50): `oniDeviceGetInfo' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `openni::Device::close()' 内: Color_Stream.cpp:(.text._ZN6openni6Device5closeEv[_ZN6openni6Device5closeEv]+0x7c): `oniDeviceClose' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::String::String(char const*)' 内: Color_Stream.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x58): `cv::String::allocate(unsigned int)' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::String::~String()' 内: Color_Stream.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): `cv::String::deallocate()' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::String::operator=(cv::String const&)' 内: Color_Stream.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x30): `cv::String::deallocate()' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::Mat::Mat(int, int, int, void*, unsigned int)' 内: Color_Stream.cpp:(.text._ZN2cv3MatC2EiiiPvj[_ZN2cv3MatC5EiiiPvj]+0x134): `cv::error(int, cv::String const&, char const*, char const*, int)' に対する定義されていない参照です Color_Stream.cpp:(.text._ZN2cv3MatC2EiiiPvj[_ZN2cv3MatC5EiiiPvj]+0x208): `cv::error(int, cv::String const&, char const*, char const*, int)' に対する定義されていない参照です Color_Stream.cpp:(.text._ZN2cv3MatC2EiiiPvj[_ZN2cv3MatC5EiiiPvj]+0x2a4): `cv::Mat::updateContinuityFlag()' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::Mat::~Mat()' 内: Color_Stream.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): `cv::fastFree(void*)' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::Mat::release()' 内: Color_Stream.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x68): `cv::Mat::deallocate()' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `cv::Mat::operator=(cv::Mat&&)' 内: Color_Stream.cpp:(.text._ZN2cv3MataSEOS0_[_ZN2cv3MataSEOS0_]+0xf8): `cv::fastFree(void*)' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `DepthSensor::update()' 内: Color_Stream.cpp:(.text._ZN11DepthSensor6updateEv[_ZN11DepthSensor6updateEv]+0xa4): `cv::imshow(cv::String const&, cv::_InputArray const&)' に対する定義されていない参照です /tmp/ccdAqM55.o: 関数 `DepthSensor::showColorStream(openni::VideoFrameRef const&)' 内: Color_Stream.cpp:(.text._ZN11DepthSensor15showColorStreamERKN6openni13VideoFrameRefE[_ZN11DepthSensor15showColorStreamERKN6openni13VideoFrameRefE]+0x8c): `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)' に対する定義されていない参照です collect2: error: ld returned 1 exit status
該当のソースコード
#include <iostream> #include <stdexcept> #include <openni2/OpenNI.h> #include <opencv2/opencv.hpp> class DepthSensor{ public: void initialize(){ //デバイスを取得する openni::Status ret = device.open(openni::ANY_DEVICE); if(ret != openni::STATUS_OK){ throw std::runtime_error("openni::Device::open() failed."); } //カラーストリームを有効にする colorStream.create(device,openni::SENSOR_COLOR); //changeResolution(colorStream); colorStream.start(); } //フレームの更新処理 void update(){ openni::VideoFrameRef colorFrame; //更新されたフレームを所得する colorStream.readFrame(&colorFrame); //フレームのデータを表示できる形に変換する colorImage = showColorStream(colorFrame); //フレームのデータを表示する cv::imshow("Color Stream",colorImage); } private: void changeResolution(openni::VideoStream& stream){ openni::VideoMode mode = stream.getVideoMode(); mode.setResolution(640,480); mode.setFps(30); stream.setVideoMode(mode); } //カラーストリームを表示できる形に変換する cv::Mat showColorStream(const openni::VideoFrameRef& colorFrame){ //OpenCVの形に変換する cv::Mat colorImage = cv::Mat(colorFrame.getHeight(),colorFrame.getWidth(),CV_8UC3,(unsigned char*)colorFrame.getData()); //BGRの並びをRGBに変換する cv::cvtColor(colorImage,colorImage,CV_RGB2BGR); return colorImage; } private: openni::Device device; //使用するデバイス openni::VideoStream colorStream; //カラーストリーム cv::Mat colorImage; //表示用データ }; int main(int argc,const char * argv[]){ try{ //OpenNIを初期化する openni::OpenNI::initialize(); //センサーを初期化する DepthSensor sensor; sensor.initialize(); //メインループ while(1){ sensor.update(); int key = cv::waitKey(10); if(key == 'q'){ break; } } } catch (std::exception&){ std::cout << openni::OpenNI::getExtendedError() << std::endl; } return 0; }
試したこと
opencvとopenniの場所があってるか、プログラムにミスが無いかの確認。
補足情報(FW/ツールのバージョンなど)
OpenNI 3Dセンサープログラミングという本を参考にしました。
OpenCVのバージョン3.4.3と、OpenNI2を使っています。
Cしか書いたことが無く、C++はよく理解してません。
〇〇のファイルを見せてほしい、等ありましたら言ってください。
よろしくお願いします。
###コンパイル時のコマンドライン
sudo g++ -o Color_Stream.exe Color_Stream.cpp
回答2件
あなたの回答
tips
プレビュー