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

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

ただいまの
回答率

90.84%

  • C++

    3136questions

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

  • Visual Studio

    1621questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • OpenCV

    929questions

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

OpenCVで最大領域を抽出したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 411

Tomo29

score 6

前提・実現したいこと

VisualStudioとOpenCVを用いて、色認識を行った後最大領域を取得したいと思っております。
下記のような形にしたいと思います。

//src_img は特定の色を抜き取っただけ。ノイズあり
//この関数でノイズを取り払うため、最大領域のみを抽出したMat型が欲しい。最大領域以外はマスク
Mat MaxArea(Mat src_img){
//最大領域を計算
 return output;
}

該当のソースコード

最大領域を抽出する関数を下記のサイトより参考にしたものになります。
最大領域の取得までは出来ていると思うのですが、ここから何を追記したら出来るのかが分かりません。

Mat MaxArea(Mat srcImg) {
    Mat input(srcImg.rows, srcImg.cols, srcImg.type());
    Mat Output(srcImg.rows, srcImg.cols, srcImg.type());//出力用のMat

    threshold(srcImg, input, 200, 255, CV_THRESH_BINARY);

    std::vector<std::vector<Point>> controus;
    findContours(input, controus, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
    auto maxContour = std::max_element(controus.begin(), controus.end(), [](std::vector<Point> x, std::vector<Point> y){
        return contourArea(x) < contourArea(y);
    });

    auto area = [maxContour]() {
        Mat pointf;
        Mat(*maxContour).convertTo(pointf, CV_32F);

        return fitEllipse(pointf);
    }();
      //ここから何を追加していいのか分からない

      return Output;//Output :最大領域のみ抽出したMat型
}

質問

該当のソースコードに何を追加したら、実現したいところで書いた関数の形に出来るのか。

試したこと

http://blog.okazuki.jp/entry/2015/01/31/232916を参考に最大領域の抽出を行いました。

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

Visual Studio 2017 Community
OpenCV 3.4.0

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • episteme

    2018/01/10 15:49

    質問が明記されていない。やりなおし。

    キャンセル

  • Tomo29

    2018/01/10 16:11

    大変失礼致しました。該当のソースコードをどういじれば、実現したいことに書かせて頂いた関数の形に持っていけるでしょうか。これが質問となります。調べましたが、分からなかったためご教授頂ければと思います。

    キャンセル

  • episteme

    2018/01/10 16:21

    ↑...と、質問を修正してください。特に「該当のコード」は何か/これのどこをどうしたいのか。

    キャンセル

  • Tomo29

    2018/01/10 16:34

    質問を修正させて頂きました。

    キャンセル

回答 2

+1

最大領域とはすなわち長方形の 左上隅 と 右下隅(または幅/高さ) ですか?
求められた maxContour をそのまま返せばよくないですか?

現時点で返そうとしているMatは画像であり、領域ではありませんよね?
それとも、入力となったsrcImgをmaxContourで切り取ったMatを返したいのですか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/10 17:18

    後者の切り取ったMatを返したいと思っております。

    キャンセル

  • 2018/01/10 17:22

    cv::Mat newMat = oldMat(cv::Rect(左端,上端,右端,下端)); ではダメですか?

    キャンセル

  • 2018/01/10 17:40

    出来るだけ本来の形のままにしたいと思っております。
    なぜかというと、最大領域を出した後、その重心を求めシステムに使用しようと思っているためです。
    もし処理が重くなるようでしたら、提案して頂いた四角形で行いたいと思います。
    なので、切り取った物または先ほどご提案頂いた物どちらかのやり方を教えて頂ければと思います(できれば両方)
    大変お手数をお掛けしますが、よろしくお願い致します。

    キャンセル

  • 2018/01/10 21:22

    教えてもなにもそのまんまやないですか。

    キャンセル

  • 2018/01/10 22:47

    分かりました。さらに調べてみます。ありがとうございました。

    キャンセル

check解決した方法

0

https://qiita.com/wakaba130/items/9d921b8b3eb812e4f197
ここのサイトの乗っているソースコードを改変していくと出来ました。
ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • C++

    3136questions

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

  • Visual Studio

    1621questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • OpenCV

    929questions

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