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

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

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

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

C++

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

Kinect

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

Q&A

0回答

3039閲覧

opencvのcvConvert関数エラーについて

k944727

総合スコア11

OpenCV

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

C++

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

Kinect

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

0グッド

0クリップ

投稿2016/11/17 02:26

編集2016/11/17 06:07

こんにちは
解決できない問題があり、大変困っているため助力を頂きたく投稿しました。

###前提・実現したいこと
Kinectを用いて色検出を行うプログラムを作成しているのですが、うまく実行できません。
エラーメッセージを見てもどこがおかしいか分からず困っております。
どのようにすればこのプログラムは動かすことができるでしょうか?

###発生している問題・エラーメッセージ
下記のソースコードで動かすと、ビデオソースでビデオを選択した後に下のエラーメッセージが表示されます。

エラーメッセージ
OpenCV Error: Bad argument (Unknown array type) in cv::cvarrToMat, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\matrix.cpp, line 698
exception!!

###該当のソースコード
#include <iostream>
#include <opencv2/opencv.hpp>
#include <cstdio>
#include "Labeling.h"
using namespace cv;
using namespace std;
int num;
int main(){
try {
VideoCapture capture(0);
Mat RGBMap, Cloud, valid;
IplImage ipl_RGB;
IplImage *imgR, *imgG = 0, *imgB;
IplImage *imgThreshold_R, *imgThreshold_G, *imgThreshold_B, *imgResult, *imgTmp, *RGB_image;
int x, y;
short *dst;
LabelingBS labeling;
RegionInfoBS *ri;
dst = new short[640 * 480];

imgThreshold_R = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); imgThreshold_G = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); imgThreshold_B = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); imgResult = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); imgTmp = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); imgR = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); //Red imgG = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); //Green imgB = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); //Blue while (1) { // データの更新を待つ capture.grab(); // RGBを取得して表示 capture.retrieve(RGBMap, CV_CAP_OPENNI_BGR_IMAGE); ipl_RGB = RGBMap; RGB_image = &ipl_RGB; cvSplit(RGB_image, imgB, imgG, imgR, NULL); // 赤の要素が100以上で、緑と青より1.5倍以上あるピクセルを抽出 cvThreshold(imgB, imgThreshold_B, 100, 255, CV_THRESH_BINARY); cvDiv(imgB, imgG, imgTmp, 10); // 10倍 cvThreshold(imgTmp, imgThreshold_G, 18, 255, CV_THRESH_BINARY); cvDiv(imgB, imgR, imgTmp, 10); cvThreshold(imgTmp, imgThreshold_R, 18, 255, CV_THRESH_BINARY); cvAnd(imgThreshold_G, imgThreshold_R, imgTmp, NULL); cvAnd(imgTmp, imgThreshold_B, imgResult, NULL); cvAnd(imgThreshold_G, imgThreshold_R, imgTmp, NULL); cvAnd(imgTmp, imgThreshold_B, imgResult, NULL); //ラベリング labeling.Exec((uchar *)imgResult->imageData, dst, imgResult->width, imgResult->height, true, 30); if (labeling.GetNumOfResultRegions() != 0){ ri = labeling.GetResultRegionInfo(0); //四角形の描画 int ltop_x, ltop_y, rbottom_x, rbottom_y; ri->GetMin(ltop_x, ltop_y); ri->GetMax(rbottom_x, rbottom_y); cvLine(RGB_image, cvPoint(ltop_x, ltop_y), cvPoint(rbottom_x, ltop_y), CV_RGB(255, 255, 255)); cvLine(RGB_image, cvPoint(rbottom_x, ltop_y), cvPoint(rbottom_x, rbottom_y), CV_RGB(255, 255, 255)); cvLine(RGB_image, cvPoint(rbottom_x, rbottom_y), cvPoint(ltop_x, rbottom_y), CV_RGB(255, 255, 255)); cvLine(RGB_image, cvPoint(ltop_x, rbottom_y), cvPoint(ltop_x, ltop_y), CV_RGB(255, 255, 255)); float f_x, f_y; ri->GetCenter(f_x, f_y); x = (int)f_x; y = (int)f_y; capture.retrieve(Cloud, CV_CAP_OPENNI_POINT_CLOUD_MAP); capture.retrieve(valid, CV_CAP_OPENNI_VALID_DEPTH_MASK); if (valid.at<unsigned char>(y, x) == 0xff){ Vec3f s = Cloud.at<Vec3f>(y, x); printf("%f %f %f\n", s[0], s[1], s[2]); //座標を表示 } else{ printf("invalid!\n"); } } cvShowImage("Window", RGB_image); if (waitKey(10) >= 0) { break; } } destroyAllWindows(); } catch (...) { cout << "exception!!" << endl; }

}

###補足情報(言語/FW/ツール等のバージョンなど)
C++
VS2012
OpenCV2.4.10
KinectV2

###追記
イメージ説明

画像の一つ目のブレイクポイントまでは正常に動きましたが、二つ目においてエラーが発生しました。

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

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

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

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

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

MasahikoHirata

2016/11/17 03:25

エラーの内容としては、実際にIplimageに入っている内容があっていないのでcvArrからMatに変換の際にエラーが。エラーを起こしているのは内部関数なので、どこかの関数が読んでいる。ざっくりソースを読んでみたが、captureの周辺では変なところが見当たらない。’cvSplit(RGB_image, imgB, imgG, imgR, NULL); ’まで来ているかブレークポイント設定できますか?
k944727

2016/11/17 06:08

ブレークポイント設定を行った画像を追記にのせました。お忙しいところありがとうございます。
MasahikoHirata

2016/11/17 06:22

下の’autos'を見るとRGB_imageが他のimgB,imgG,imgRと同じ構造に見える。おそらくRGB(opencvはBGRの並びだけど)の形でないのでは?
k944727

2016/11/17 06:31

あまりに無知で申し訳ないのですが、RGBの形でないということの意味が分かりません。本当にお手数をかけてしまい申し訳ないのですが詳しく教えてもらえると幸いです。
MasahikoHirata

2016/11/17 06:41

後で細かい説明しますが、RGB_imageが小さい気がするのです。確認しますので。
k944727

2016/11/17 06:53 編集

わかりました。お忙しいところ本当にありがとうございます。
MasahikoHirata

2016/11/17 07:36

cvsplitの前に行を数行挿入してその中に’imshow("RGB",RGBMap);'を入れたら何が表示されますか?
k944727

2016/11/18 05:25

返信ありがとうございます。OpenCV Error: Assertion failed (dvec[j].size() == src.size()) in cvSplit, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\convert.cpp, line 1288のように表示されました
MasahikoHirata

2016/11/22 07:35

'Assertion failed'が出てますので、配列の構造が関数に適合していないと考えます。ソースを更に読んで後に回答を差し上げたいと存じます。
k944727

2016/11/25 04:33

ありがとうございます!
MasahikoHirata

2016/12/09 09:36

遅くなって申し訳ない。’capture.grab(); ’ってグラフカットですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問