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

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

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

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

C++

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

解決済

std::vectorの扱い方

Spi_muto
Spi_muto

総合スコア0

OpenCV

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

C++

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

1回答

0評価

0クリップ

363閲覧

投稿2021/09/02 06:49

前提・実現したいこと

カメラから映像を取得して、そこから顔認識をし認識した顔に枠をつけるというプログラムを作成しています。
プログラム自体は動くのですが、終了させたときにエラーが出てしまいます。

発生している問題・エラーメッセージ

corrupted size vs. prev_size 中止

該当のソースコード

c++

//opencvでの顔認識 //マウスの座標取得,ビーム照射方向計算 //複数顔へのマーク //プログラム終了したときにエラー出る"corrupted size vs. prev_size" #include "opencv2/opencv.hpp" #include "opencv2/highgui.hpp" #include <vector> using namespace cv; using namespace std; //コールバック関数 void mouse_callback(int event, int x, int y, int flags, void *userdata) { if (event == EVENT_LBUTTONDOWN) { int Ax = 1, Ay = 1; if ((x - 320) < 0) { Ax = -1; } if ((y - 240) > 0) { Ay = -1; } double X = (x - 320) / 3.04e+03; double Y = (y - 240) / 3.04e+03; system("clear"); //マウスの座標出力 cout << "(x, y) = " << "(" << x << ", " << y << ")" << endl; cout << "方位角: " << Ax * acos(1/sqrt(X * X + 1)) * 180 / 2 * M_PI << "°" << endl; cout << "仰角:  " << Ay * acos(1/sqrt(Y * Y + 1)) * 180 / 2 * M_PI << "°" << endl; //cout << endl << "z: ズームイン" << endl << "x: ズームアウト" << endl; cout << endl << "s: スクリーンショット" << endl; cout << "q: 終了" << endl; } } int main() { VideoCapture cap(0); // USBカメラのオープン if (!cap.isOpened()) //カメラが起動できなかった時のエラー処理 { return -1; } Mat frame; //USBカメラから得た1フレームを格納する場所 CascadeClassifier cascade; //カスケード分類器格納場所 cascade.load("../opencv_build/opencv-4.2.0/data/haarcascades/haarcascade_frontalface_alt.xml"); //正面顔情報が入っているカスケード vector<Rect> faces; //輪郭情報を格納場所 std::vector<int> x = {0};//顔座標の左上のx座標 std::vector<int> y = {0};//顔座標の左上のy座標 std::vector<int> x_end = {0};//顔座標の右下のx座標 std::vector<int> y_end = {0};//顔座標の右下のy座標 while (cap.read(frame)) { //格納されたフレームに対してカスケードファイルに基づいて顔を検知 cascade.detectMultiScale(frame, faces, 1.2, 5, 0, Size(20, 20)); //顔を検出した場合 if (faces.size() > 0) { for (int i = 0; i < faces.size(); i++) { //顔座標の左上の座標 x[i] = faces[i].x; y[i] = faces[i].y; //顔座標の右下の座標を求める x_end[i] = x[i] + faces[i].width; y_end[i] = y[i] + faces[i].height; rectangle(frame, Point(x[i], y[i]), Point(x_end[i], y_end[i]), Scalar(0, 0, 255), 3); } } imshow("camera", frame);//画像を表示. setMouseCallback("camera", mouse_callback); const int key = cv::waitKey(1); // //zでズームイン // if (key == 'z') { // zoom += zoomRate; // } // //xでズームアウト // else if (key == 'x') { // zoom -= zoomRate; // if(zoom < 1) zoom = 1; // } //sボタンでスクリーンショット if (key == 's') { std::string name; std::cout << "file name?" << endl; std::getline(std::cin, name); cv::imwrite(name, frame); } //qボタンが押されたとき else if(key == 'q') { break; } } destroyAllWindows(); return 0; }

試したこと

vectorの宣言のところで

std::vector<int> x;//顔座標の左上のx座標

としたところ、segmentation faltになった。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenCV

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

C++

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