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

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

ただいまの
回答率

90.33%

  • C++

    3786questions

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

  • OpenCV

    1240questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 781

KenKenPaPPa

score 16

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

開発環境
xcode opencv3 c++

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <string>
#include <math.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgcodecs/imgcodecs_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cvaux.h>
#include <complex>


#define _USE_MATH_DEFINES

using namespace cv;

double angle(double a,double b) {

    double c = a - b;
    double d = double(atan(double(c/10)));
    // d = d * 180 / M_PI;
    //printf("angle:%lf\n", d);


    return d;
}


int main(int argc, const char * argv[]) {

    printf("start");

    cv::VideoCapture cap(0);
    //cv::VideoCapture cap("/usr/local/kenshi/scene6.mp4");
    if (!cap.isOpened()) {
        printf("NO READ");
        return -1;
    }

   // cv::Mat black_img = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

    cv::namedWindow("window", CV_WINDOW_AUTOSIZE);

    std::string cascadeName = "/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml";

    std::string cascadeName1 = "/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_mcs_nose.xml";

    cv::CascadeClassifier cascade;
    cv::CascadeClassifier cascade1;

    if (!cascade.load(cascadeName))
        return -1;
   if (!cascade1.load(cascadeName1))
        return -1;

    std::vector<cv::Rect> faces;
    std::vector<cv::Rect> nose;


    int ppl[10];
    int facex[10];
    int facey[10];
    int facer[10];
    int b = 0;



    for (;;)
    {

        cv::Mat frame;
        cv::Mat input_image;
        cv::Mat output_image;
        cap >> frame;
        cvtColor(frame, input_image, CV_BGR2GRAY);
        cv::equalizeHist(input_image, input_image);
        output_image = frame;
        flip(output_image, output_image, 1);
        flip(input_image, input_image, 1);     

        cascade.detectMultiScale(input_image, faces,
                                 1.3, 3,
                                 CV_HAAR_SCALE_IMAGE
                                 ,
                                 cv::Size(50, 50));

        cascade1.detectMultiScale(input_image, nose,
                                  1.3, 3,
                                  CV_HAAR_SCALE_IMAGE
                                  ,
                                  cv::Size(50, 50));

        std::vector<cv::Rect>::const_iterator r = faces.begin();
        std::vector<cv::Rect>::const_iterator r1 = nose.begin();

        int radius;
        int radius1;

        cv::Point center;
        for (; r != faces.end(); ++r) {

            center.x = cv::saturate_cast<int>((r->x + r->width*0.5));
            center.y = cv::saturate_cast<int>((r->y + r->height*0.5));
            radius = cv::saturate_cast<int>((r->width + r->height)*0.25);
            cv::circle(output_image, center, radius, cv::Scalar(80, 80, 255), 3, 8, 0);

            facex[b] = center.x;
            facey[b] = center.y;
            facer[b] = radius;
            b++;


        }



        cv::Point center1;
        int k = 0;

            for (; r1 != nose.end(); ++r1) {
                center1.x = cv::saturate_cast<int>((r1->x + r1->width*0.5));
                center1.y = cv::saturate_cast<int>((r1->y + r1->height*0.5));
                radius1 = cv::saturate_cast<int>((r1->width + r1->height)*0.25);

                for(int i = 0; i < b; i++){

                    if((facex[i]-center1.x)^2+(facey[i]-center1.y)^2 < facer[i] ^2){
                    cv::circle(output_image, center1, radius1, cv::Scalar(80, 80, 0), 3, 8, 0);
                        //顔、鼻、角度セットで出力して角度を配列に格納
                        printf("nose(%d,%d)\n", center1.x, center1.y);
                        printf("face(%d,%d)\n", facex[i], facey[i]);
                        printf("radius%d\n", facer[i]);
                        double rad = angle(int(facex[i]), int(center1.x));

                        ppl[k] = rad;
                        printf("k=%d,angle:%f\n", k,rad );
                        k++;
                        break;
                    }


                }





            }
        k=0;
        b=0;



        imshow("window", output_image);


        cv::waitKey(0);
        destroyAllWindows();

       // faces.clear ();
        //nose.clear();
         //faces.shrink_to_fit();
         //nose.shrink_to_fit();
    }



    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

こんにちは。

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/16 13:44

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

    キャンセル

  • 2017/01/16 13:47

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

    キャンセル

  • 2017/01/16 14:00

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

    キャンセル

0

cv::waitKey(0);のパラメーターを1以上にしたら良いのでは?0で

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/16 13:40

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

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C++

    3786questions

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

  • OpenCV

    1240questions

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