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

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

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

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

C++

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

Q&A

解決済

2回答

2745閲覧

カメラキャプチャしたいが1枚目を表示して動作が止まる

KenKenPaPPa

総合スコア24

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/01/15 17:34

お世話になってます。
現在大学3年生で最近プログラミングの勉強を始めた者です。
今opencv3を使って複数人の顔方向を検出しようとしているのですが、
急に,カメラキャプチャした後の表示がうまく行かなくなりました。
カメラを開いてからの1枚目の画像が表示されるだけです。
どこを改善したらいいのか、教えていただけるとありがたいです。

開発環境
xcode opencv3 c++

c++

1 2 3#include <iostream> 4#include <opencv2/core.hpp> 5#include <opencv2/highgui.hpp> 6#include <opencv/cv.h> 7#include <opencv/highgui.h> 8#include <stdio.h> 9#include <opencv2/opencv.hpp> 10#include <string> 11#include <math.h> 12#include <opencv2/core/core.hpp> 13#include <opencv2/imgproc/imgproc.hpp> 14#include <opencv2/imgcodecs/imgcodecs.hpp> 15#include <opencv2/imgcodecs/imgcodecs_c.h> 16#include <opencv2/highgui/highgui.hpp> 17#include <opencv/cvaux.h> 18#include <complex> 19 20 21#define _USE_MATH_DEFINES 22 23using namespace cv; 24 25double angle(double a,double b) { 26 27 double c = a - b; 28 double d = double(atan(double(c/10))); 29 // d = d * 180 / M_PI; 30 //printf("angle:%lf\n", d); 31 32 33 return d; 34} 35 36 37int main(int argc, const char * argv[]) { 38 39 printf("start"); 40 41 cv::VideoCapture cap(0); 42 //cv::VideoCapture cap("/usr/local/kenshi/scene6.mp4"); 43 if (!cap.isOpened()) { 44 printf("NO READ"); 45 return -1; 46 } 47 48 // cv::Mat black_img = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3); 49 cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 50 cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 51 52 cv::namedWindow("window", CV_WINDOW_AUTOSIZE); 53 54 std::string cascadeName = "/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"; 55 56 std::string cascadeName1 = "/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_mcs_nose.xml"; 57 58 cv::CascadeClassifier cascade; 59 cv::CascadeClassifier cascade1; 60 61 if (!cascade.load(cascadeName)) 62 return -1; 63 if (!cascade1.load(cascadeName1)) 64 return -1; 65 66 std::vector<cv::Rect> faces; 67 std::vector<cv::Rect> nose; 68 69 70 int ppl[10]; 71 int facex[10]; 72 int facey[10]; 73 int facer[10]; 74 int b = 0; 75 76 77 78 for (;;) 79 { 80 81 cv::Mat frame; 82 cv::Mat input_image; 83 cv::Mat output_image; 84 cap >> frame; 85 cvtColor(frame, input_image, CV_BGR2GRAY); 86 cv::equalizeHist(input_image, input_image); 87 output_image = frame; 88 flip(output_image, output_image, 1); 89 flip(input_image, input_image, 1); 90 91 cascade.detectMultiScale(input_image, faces, 92 1.3, 3, 93 CV_HAAR_SCALE_IMAGE 94 , 95 cv::Size(50, 50)); 96 97 cascade1.detectMultiScale(input_image, nose, 98 1.3, 3, 99 CV_HAAR_SCALE_IMAGE 100 , 101 cv::Size(50, 50)); 102 103 std::vector<cv::Rect>::const_iterator r = faces.begin(); 104 std::vector<cv::Rect>::const_iterator r1 = nose.begin(); 105 106 int radius; 107 int radius1; 108 109 cv::Point center; 110 for (; r != faces.end(); ++r) { 111 112 center.x = cv::saturate_cast<int>((r->x + r->width*0.5)); 113 center.y = cv::saturate_cast<int>((r->y + r->height*0.5)); 114 radius = cv::saturate_cast<int>((r->width + r->height)*0.25); 115 cv::circle(output_image, center, radius, cv::Scalar(80, 80, 255), 3, 8, 0); 116 117 facex[b] = center.x; 118 facey[b] = center.y; 119 facer[b] = radius; 120 b++; 121 122 123 } 124 125 126 127 cv::Point center1; 128 int k = 0; 129 130 for (; r1 != nose.end(); ++r1) { 131 center1.x = cv::saturate_cast<int>((r1->x + r1->width*0.5)); 132 center1.y = cv::saturate_cast<int>((r1->y + r1->height*0.5)); 133 radius1 = cv::saturate_cast<int>((r1->width + r1->height)*0.25); 134 135 for(int i = 0; i < b; i++){ 136 137 if((facex[i]-center1.x)^2+(facey[i]-center1.y)^2 < facer[i] ^2){ 138 cv::circle(output_image, center1, radius1, cv::Scalar(80, 80, 0), 3, 8, 0); 139 //顔、鼻、角度セットで出力して角度を配列に格納 140 printf("nose(%d,%d)\n", center1.x, center1.y); 141 printf("face(%d,%d)\n", facex[i], facey[i]); 142 printf("radius%d\n", facer[i]); 143 double rad = angle(int(facex[i]), int(center1.x)); 144 145 ppl[k] = rad; 146 printf("k=%d,angle:%f\n", k,rad ); 147 k++; 148 break; 149 } 150 151 152 } 153 154 155 156 157 158 } 159 k=0; 160 b=0; 161 162 163 164 imshow("window", output_image); 165 166 167 cv::waitKey(0); 168 destroyAllWindows(); 169 170 // faces.clear (); 171 //nose.clear(); 172 //faces.shrink_to_fit(); 173 //nose.shrink_to_fit(); 174 } 175 176 177 178 return 0; 179} 180 181 182 183

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

急に,カメラキャプチャした後の表示がうまく行かなくなりました。

「急に」というのは、プログラムも変更していないし、PCの設定やハードウェアの接続など、一切変更していないのにうまく行かなくなったというニュアンスでしょうか?
しかし、ソースを見る限り、このソースでは1枚目しか表示できないと思います。つまり、ソースを変更することでうまく行かなくなったということではないでしょうか?

このような時は、うまく行かなくなる前のソースに戻してみることが早道です。そして、うまく行かなくなる修正がどれか特定できれば、その理由も把握できます。

さて、原因は一目瞭然なのでヒントだけ。for(;;)文で繰り返すことで2枚目以降を表示するのだと思いますが、どこに表示しますか? それと、MasahikoHirataさんも指摘されてますが、waitkey()の仕様を確認することをお勧めします。

投稿2017/01/16 01:30

Chironian

総合スコア23272

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

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

KenKenPaPPa

2017/01/16 04:44

1枚目の処理でwindowを破棄してしまって2枚目以降で表示する場所がないということでしょうか?waitkey(0)が間違えてました!ご指摘ありがとうございます!
Chironian

2017/01/16 04:47

その通りです。頑張って下さい。
KenKenPaPPa

2017/01/16 05:00

丁寧に教えてくださり、ありがとうございました!
guest

0

cv::waitKey(0);のパラメーターを1以上にしたら良いのでは?0ではキー入力待ちになります。

投稿2017/01/15 20:17

MasahikoHirata

総合スコア3747

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

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

KenKenPaPPa

2017/01/16 04:40

おっしゃる通りで、waitKey(0)で次の処理に移ってなかったのが原因でした! ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問