質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

1074閲覧

ラズパイでのOpenCV,OpenNIを用いてカメラから映像を取得したい。

huroku

総合スコア12

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2018/09/07 05:28

編集2018/09/07 07:42

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazto

2018/09/07 07:35

プログラムをコンパイルした際のコマンドラインを追記お願いします。
huroku

2018/09/07 07:36

承知しました。
guest

回答2

0

ベストアンサー

OpenCVやOpenNIなどのライブラリを使用する場合は、以下のような手順をとる必要があります。

  • ヘッダをインクルードして、関数を呼び出す
  • ライブラリをリンクして、関数が使える状態にする

ソースコード内でヘッダをインクルードして呼び出すことはできていますが、ライブラリをリンクする手順ができていないようです。

以下のような感じで、コンパイルの際にリンクする必要があります。

Bash

1g++ -o Color_Stream.exe Color_Stream.cpp ¥ 2 -I/usr/local/include/opencv2 ¥ 3 -I/usr/local/include/openni2 ¥ 4 -L/usr/local/lib/opencv2 ¥ 5 -L/usr/local/lib/openni2 ¥ 6 -lopencv2_world ¥ 7 -lOpenNI2

注意点として。

  • -Lオプションはライブラリ(*.soファイル)が実際存在するパスに読み換えてください
  • -lオプションは、実際のライブラリ名に読み換えてください
  • OpenCV固有の事情になりますが、OpenCVのインストール方法によっては、libopencv_world.soが存在せず、libopencv_core.so, libopencv_highgui.so, ... などのように細かく部品に分かれている場合が多いです。この場合、それぞれを-lオプションで指定してやる必要があります。

投稿2018/09/07 08:39

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

huroku

2018/09/08 00:36

回答、ありがとうございます。 g++ Color_Stream.cpp -lm `pkg-config --libs opencv` -L/usr/local/lib/ni2 -I/usr/local/include/ni2 -I/usr/local/include -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lOpenNI2 -v と打ち込めばコンパイルすることができました。 細かく説明していただいたにも関わらず、すみません。
guest

0

エラーが示す内容はご理解していないようですが、CやC++に関係ないエラーです。
ビルドの方法をその書籍に記載はないのですか?

ビルド時にOpenCVやOpenNIのライブラリを指定していないか、間違えているかではないかと。

投稿2018/09/07 07:22

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

huroku

2018/09/07 07:30

回答ありがとうございます。 なるほど、CやC++に関係ないエラーなのですね。 ビルドというのはOpenCVのビルドで、ですか? でしたら本には載っていなかったので他サイトを参考にしつつビルドしました。 "OpenCVやOpenNIのライブラリを指定"というのはどの時点でするものなのでしょうか? 初歩的な質問ですみません。
t_obara

2018/09/07 07:37

貴殿が提示したコードのビルドです。書籍に書いていませんか?これをしないと実行もできないです。
huroku

2018/09/07 07:41

書いて無かったです... プログラムの全文が書かれていて、 「このプログラムを実行する」とだけありました。 なので、ネットでC++のプログラムのコンパイルと実行のやり方を検索してやりました。
huroku

2018/09/07 07:52

紹介してくださったサイトを参考にして sudo g++ -o Color_Stream.exe Color_Stream.cpp -I/usr/local/include/opencv2 -I/usr/local/include/openni2 と打ったところ、同じようなエラーが出てきました。 どこが間違っているのでしょうか...? よろしくお願いします。
t_obara

2018/09/07 08:15

もう少し内容を理解してください。-I はコンパイル時に利用されるオプション、リンク時にはライブラリパスを指定するオプションが必要です。
huroku

2018/09/08 00:34

返信、ありがとうございます。 g++ Color_Stream.cpp -lm `pkg-config --libs opencv` -L/usr/local/lib/ni2 -I/usr/local/include/ni2 -I/usr/local/include -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lOpenNI2 -v と打ち込むと無事、コンパイルできました。 真摯に回答していただいたにも関わらず、自己解決してしまってすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問