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

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

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

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

0回答

1617閲覧

Visual Studio C++ OpenMP

kaihatu

総合スコア7

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2016/10/13 03:19

編集2016/10/13 04:19

現在カメラから得た情報を画像処理し
ある特定の色だけを取り出すプログラムを作成しているのですが
これらの作業を並列化するにあたってつまずいており
少し手助けや助言をお願いします
イメージ説明
一応こちらの流れのようにしたいのですが
現在並列処理にOpenMPを使用しており
カメラからの情報取得と左右それぞれのカメラ結果の画像処理まで
並列化ができており、
そこから画像処理したものの色の抽出を行う段階での
並列化がうまくいかず、おそらく順次処理の動きになってしまいます
OpenMPでは並列にさらに並列を重ねることはできないのでしょうか
またできない場合には別の方法があれば教えてください

*実際のプログラムではうまくいかなかった色抽出の並列化や球の距離計測部分は省略しております

#pragma omp parallel #pragma omp sections { #pragma omp section { while (1){ //カメラ情報のキャプチャー cap1 >> input_img1[j]; cap2 >> input_img2[j]; j++; if (j == 10){ j = 0; } } } #pragma omp section { int k = 0; while (1){ if (j != k){ hsv_skin_img1 = Scalar(0, 0, 0); cvtColor(input_img1[k], hsv_img1, CV_BGR2HSV); //HSVに変換 //問題の並列化したい作業 for (int y = 0; y < 480; y++) { for (int x = 0; x < 640; x++) { int a = hsv_img1.step*y + (x * 3); if (hsv_img1.data[a] >= 0 && hsv_img1.data[a] <= 15 && hsv_img1.data[a + 1] >= 50 && hsv_img1.data[a + 2] >= 50) //HSVでの検出 { hsv_skin_img1.data[a] = 255; //肌色部分を青に } } } //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); gray_img1 = cvCreateImage(cvGetSize(&(IplImage(hsv_skin_img1))), IPL_DEPTH_8U, 1); // グレイスケールに変換 cvCvtColor(&(IplImage(hsv_skin_img1)), gray_img1, CV_BGR2GRAY); CvMoments moments; cvMoments(gray_img1, &moments, 0); double m00 = cvGetSpatialMoment(&moments, 0, 0); double m10 = cvGetSpatialMoment(&moments, 1, 0); double m01 = cvGetSpatialMoment(&moments, 0, 1); int gX = m10 / m00, gY = m01 / m00; k = j; } } } #pragma omp section { int k = 0; while (1){ if (j != k){ hsv_skin_img2 = Scalar(0, 0, 0); cvtColor(input_img2[k], hsv_img2, CV_BGR2HSV); //HSVに変換 // #pragma omp parallel forを使いたいが高速にならないため //問題の並列化したい作業 for (int y = 0; y < 480; y++) { for (int x = 0; x < 640; x++) { int a = hsv_img2.step*y + (x * 3); if (hsv_img2.data[a] >= 0 && hsv_img2.data[a] <= 15 && hsv_img2.data[a + 1] >= 50 && hsv_img2.data[a + 2] >= 50) //HSVでの検出 { hsv_skin_img2.data[a] = 255; //肌色部分を青に } } } //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); gray_img2 = cvCreateImage(cvGetSize(&(IplImage(hsv_skin_img2))), IPL_DEPTH_8U, 1); // グレイスケールに変換 cvCvtColor(&(IplImage(hsv_skin_img2)), gray_img2, CV_BGR2GRAY); CvMoments moments; cvMoments(gray_img2, &moments, 0); double m00 = cvGetSpatialMoment(&moments, 0, 0); double m10 = cvGetSpatialMoment(&moments, 1, 0); double m01 = cvGetSpatialMoment(&moments, 0, 1); int gX = m10 / m00, gY = m01 / m00; //printf("%d\n", j); k = j; } } } } getchar(); }

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問