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

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

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

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

C++

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

Q&A

2回答

230閲覧

カメラで青い円を検出

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

C++

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

1グッド

0クリップ

投稿2017/07/09 08:23

編集2017/07/09 08:31

C++

1#include <stdio.h> 2#include <stdlib.h> 3#include <highgui.h> 4#include <cv.h> 5#include <cxcore.h> 6 7#define _DEBUG_IMG 0 8 9// テキトウな円形検出フィルター 10#define CIRCLE_FILTER_WIDTH 16 11#define CIRCLE_FILTER_HEIGHT 16 12const int CIRCLE_FILTER[CIRCLE_FILTER_HEIGHT][CIRCLE_FILTER_WIDTH] = 13{ 14 { -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3 }, 15 { -3, -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3, -3 }, 16 { -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3 }, 17 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 18 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 19 { -3, -3, +1, +1, +1, +1, +2, +2, +2, +2, +1, +1, +1, +1, -3, -3 }, 20 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 21 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 22 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 23 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 24 { -3, -3, +1, +1, +1, +1, +2, +2, +2, +2, +1, +1, +1, +1, -3, -3 }, 25 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 26 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 27 { -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3 }, 28 { -3, -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3, -3 }, 29 { -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3 } 30}; 31// 円形かの閾値 32#define CIRCLE_FILTER_THRESHOLD 110 33 34// 青色の範囲 35#define HSV_BLUE_LOWER cvScalar(40, 70, 70) 36#define HSV_BLUE_UPPER cvScalar(80, 255, 255) 37 38// 円形? 39int isCircle(int val) 40{ 41 return CIRCLE_FILTER_THRESHOLD < val ? 1:0; 42} 43 44// 青色ボール検出 45int blueBallDetect() 46{ 47 CvCapture *capture = 0; 48 capture = cvCaptureFromCAM (0); 49 IplImage *base_cap = cvQueryFrame (capture); 50 IplImage *hsv_cap = cvCreateImage(cvGetSize(base_cap), IPL_DEPTH_8U, 3); 51 IplImage *blue_base_cap = cvCreateImage(cvGetSize(base_cap), IPL_DEPTH_8U, 1); 52 IplImage *blue_cap = cvCreateImage(cvGetSize(base_cap), IPL_DEPTH_8U, 1); 53 IplImage *temp_cap; 54 55 int count = 0; 56 double scale = 1.3; 57 double current_scale = 1; 58 59 // 青色領域抽出 60 CvScalar blue_lower = HSV_BLUE_LOWER; 61 CvScalar blue_upper = HSV_BLUE_UPPER; 62 cvCvtColor(base_cap, hsv_cap , CV_BGR2HSV); 63 cvInRangeS(hsv_cap, blue_lower, blue_upper, blue_base_cap ); 64 cvCopy(blue_base_cap, blue_cap ); 65 66 // 探索 67 while (CIRCLE_FILTER_WIDTH < blue_cap ->width 68 && CIRCLE_FILTER_HEIGHT < blue_cap ->height) 69 { 70 for (int y = 0; y + CIRCLE_FILTER_HEIGHT < blue_cap ->height; y += 2) { 71 for (int x = 0; x + CIRCLE_FILTER_WIDTH < blue_cap ->width; x += 2) { 72 // フィルター出力値計算 73 int filter_value = 0; 74 75 for (int fy = 0; fy < CIRCLE_FILTER_HEIGHT; ++fy ) { 76 for (int fx = 0; fx < CIRCLE_FILTER_WIDTH; ++fx ) { 77 CvScalar color = cvGet2D( 78 blue_cap , 79 y + fy, 80 x + fx 81 ); 82 filter_value += CIRCLE_FILTER[fy][fx] * (color.val[0] == 0 ? 0:1); 83 } 84 } 85 86 if (isCircle(filter_value)) { 87 // ヒット 88 int rx = cvRound(x * current_scale); 89 int ry = cvRound(y * current_scale); 90 int rw = cvRound(CIRCLE_FILTER_WIDTH * current_scale); 91 int rh = cvRound(CIRCLE_FILTER_HEIGHT * current_scale); 92#ifdef _DEBUG 93 printf("filter value: %d\n", filter_value); 94#endif 95#if _DEBUG_IMG 96 cvCircle( 97 blue_cap , 98 cvPoint(x + (CIRCLE_FILTER_WIDTH / 2), y + (CIRCLE_FILTER_HEIGHT / 2)), 99 CIRCLE_FILTER_WIDTH, 100 cvScalar(0xcc), 2 101 ); 102#endif 103 // マーク 104 cvCircle( 105 base_cap , 106 cvPoint(rx + (rw / 2), ry + (rh /2)), 107 (rw / 2), 108 CV_RGB(255, 255, 255), 2 109 ); 110 111 ++count; 112 } 113 } 114 } 115#if _DEBUG_IMG 116 cvShowImage("BASE", blue_cap ); 117 cvWaitKey(); 118#endif 119 temp_cap = blue_cap ; 120 blue_cap = cvCreateImage( 121 cvSize( 122 cvRound(blue_cap->width / scale), 123 cvRound(blue_cap->height / scale) 124 ), 125 IPL_DEPTH_8U, 1 126 ); 127 cvResize(blue_base_cap, blue_cap); 128 cvReleaseImage(&temp_cap); 129 current_scale *= scale; 130 } 131 cvReleaseImage(&blue_cap); 132 cvReleaseImage(&blue_base_cap); 133 cvNamedWindow("BASE"); 134 cvShowImage("BASE", base_cap); 135 cvWaitKey(); 136 cvReleaseImage(&blue_cap); 137 cvReleaseImage(&blue_base_cap); 138 return count; 139} 140 141int main() 142{ 143 blueBallDetect(); 144 return EXIT_SUCCESS; 145}

パソコンのカメラで読み込んだ画像から青い円を検出するプログラムを書いたのですがOpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file /tmp/opencv3-20161231-756-1ihi7x0/opencv-3.2.0/modules/core/src/array.cpp, line 1255
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /tmp/opencv3-20161231-756-1ihi7x0/opencv-3.2.0/modules/core/src/array.cpp:1255: error: (-5) Array should be CvMat or IplImage in function cvGetSizeというエラーが出てしまいます

どうすればいいでしょうか。パソコンはmacです

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

ウインドウは表示されるが円が検出されない。

C++

1#include <stdio.h> 2#include <stdlib.h> 3#include <highgui.h> 4#include <cv.h> 5#include <cxcore.h> 6 7#define _DEBUG_IMG 0 8 9// テキトウな円形検出フィルター 10#define CIRCLE_FILTER_WIDTH 16 11#define CIRCLE_FILTER_HEIGHT 16 12const int CIRCLE_FILTER[CIRCLE_FILTER_HEIGHT][CIRCLE_FILTER_WIDTH] = 13{ 14 { -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3 }, 15 { -3, -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3, -3 }, 16 { -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3 }, 17 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 18 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 19 { -3, -3, +1, +1, +1, +1, +2, +2, +2, +2, +1, +1, +1, +1, -3, -3 }, 20 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 21 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 22 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 23 { -3, -3, +1, +1, +1, +2, +2, +2, +2, +2, +2, +1, +1, +1, -3, -3 }, 24 { -3, -3, +1, +1, +1, +1, +2, +2, +2, +2, +1, +1, +1, +1, -3, -3 }, 25 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 26 { -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3 }, 27 { -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3 }, 28 { -3, -3, -3, -3, +1, +1, +1, +1, +1, +1, +1, +1, -3, -3, -3, -3 }, 29 { -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3 } 30}; 31// 円形かの閾値 32#define CIRCLE_FILTER_THRESHOLD 110 33 34// 青色の範囲 35#define HSV_BLUE_LOWER cvScalar(95, 0, 20) 36#define HSV_BLUE_UPPER cvScalar(130, 235, 255) 37 38// 円形? 39int isCircle(int val) 40{ 41 return CIRCLE_FILTER_THRESHOLD < val ? 1:0; 42} 43 44// 青色ボール検出 45int blueBallDetect(IplImage *base_image) 46{ 47 IplImage *hsv_image = cvCreateImage(cvGetSize(base_image), IPL_DEPTH_8U, 3); 48 IplImage *blue_base_image = cvCreateImage(cvGetSize(base_image), IPL_DEPTH_8U, 1); 49 IplImage *blue_image = cvCreateImage(cvGetSize(base_image), IPL_DEPTH_8U, 1); 50 IplImage *temp_image; 51 52 int count = 0; 53 double scale = 1.3; 54 double current_scale = 1; 55 56 // 青色領域抽出 57 CvScalar blue_lower = HSV_BLUE_LOWER; 58 CvScalar blue_upper = HSV_BLUE_UPPER; 59 cvCvtColor(base_image, hsv_image, CV_BGR2HSV); 60 cvInRangeS(hsv_image, blue_lower, blue_upper, blue_base_image); 61 cvCopy(blue_base_image, blue_image); 62 63 // 探索 64 while (CIRCLE_FILTER_WIDTH < blue_image->width 65 && CIRCLE_FILTER_HEIGHT < blue_image->height) 66 { 67 for (int y = 0; y + CIRCLE_FILTER_HEIGHT < blue_image->height; y += 2) { 68 for (int x = 0; x + CIRCLE_FILTER_WIDTH < blue_image->width; x += 2) { 69 // フィルター出力値計算 70 int filter_value = 0; 71 72 for (int fy = 0; fy < CIRCLE_FILTER_HEIGHT; ++fy ) { 73 for (int fx = 0; fx < CIRCLE_FILTER_WIDTH; ++fx ) { 74 CvScalar color = cvGet2D( 75 blue_image, 76 y + fy, 77 x + fx 78 ); 79 filter_value += CIRCLE_FILTER[fy][fx] * (color.val[0] == 0 ? 0:1); 80 } 81 } 82 83 if (isCircle(filter_value)) { 84 // ヒット 85 int rx = cvRound(x * current_scale); 86 int ry = cvRound(y * current_scale); 87 int rw = cvRound(CIRCLE_FILTER_WIDTH * current_scale); 88 int rh = cvRound(CIRCLE_FILTER_HEIGHT * current_scale); 89#ifdef _DEBUG 90 printf("filter value: %d\n", filter_value); 91#endif 92#if _DEBUG_IMG 93 cvCircle( 94 blue_image, 95 cvPoint(x + (CIRCLE_FILTER_WIDTH / 2), y + (CIRCLE_FILTER_HEIGHT / 2)), 96 CIRCLE_FILTER_WIDTH, 97 cvScalar(0xcc), 2 98 ); 99#endif 100 // マーク 101 cvCircle( 102 base_image, 103 cvPoint(rx + (rw / 2), ry + (rh /2)), 104 (rw / 2), 105 CV_RGB(255, 255, 255), 2 106 ); 107 108 ++count; 109 } 110 } 111 } 112#if _DEBUG_IMG 113 cvShowImage("BASE", blue_image); 114 cvWaitKey(); 115#endif 116 temp_image = blue_image; 117 blue_image = cvCreateImage( 118 cvSize( 119 cvRound(blue_image->width / scale), 120 cvRound(blue_image->height / scale) 121 ), 122 IPL_DEPTH_8U, 1 123 ); 124 cvResize(blue_base_image, blue_image); 125 cvReleaseImage(&temp_image); 126 current_scale *= scale; 127 } 128 cvReleaseImage(&blue_image); 129 cvReleaseImage(&blue_base_image); 130 131 return count; 132} 133 134int main(int argc, const char *argv[]) 135{ 136 IplImage *base_image; 137 138 if (argc == 1) { 139 fprintf(stderr, "usage: balldetect file\n"); 140 return EXIT_FAILURE; 141 } 142 143 base_image = cvLoadImage(argv[1], 3); 144 if (! base_image) { 145 fprintf(stderr, "load error: %s\n", argv[1]); 146 return EXIT_FAILURE; 147 } 148 cvNamedWindow("BASE"); 149 150 blueBallDetect(base_image); 151 152 cvShowImage("BASE", base_image); 153 cvWaitKey(); 154 155 cvReleaseImage(&base_image); 156 157 return EXIT_SUCCESS; 158}

この同じディレクトリにある写真を読み込むプログラムならうまくいくが質問に書いたのではうまくいかない

投稿2017/07/09 08:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

int blueBallDetect()の中身をそのままint main () の中に入れることでウインドウが出てきた

投稿2017/07/09 08:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/07/09 08:53 編集

間違い
yumetodo

2017/07/09 10:26

もう何回も指摘されていると思うが、回答欄は質問者の補足欄ではない
LouiS0616

2017/07/09 10:45

OpenCVの勉強をするより先に、プログラミングの勉強をした方がよいのでは?これCでも動くんじゃないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問