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

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

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

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

OpenCV

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

C++

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

Q&A

解決済

2回答

6338閲覧

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

Tomo29

総合スコア14

Visual Studio

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

OpenCV

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

C++

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

0グッド

1クリップ

投稿2018/01/10 06:47

編集2018/01/10 07:34

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

C++

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

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

C++

1Mat MaxArea(Mat srcImg) { 2 Mat input(srcImg.rows, srcImg.cols, srcImg.type()); 3 Mat Output(srcImg.rows, srcImg.cols, srcImg.type());//出力用のMat 4 5 threshold(srcImg, input, 200, 255, CV_THRESH_BINARY); 6 7 std::vector<std::vector<Point>> controus; 8 findContours(input, controus, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 9 auto maxContour = std::max_element(controus.begin(), controus.end(), [](std::vector<Point> x, std::vector<Point> y){ 10 return contourArea(x) < contourArea(y); 11 }); 12 13 auto area = [maxContour]() { 14 Mat pointf; 15 Mat(*maxContour).convertTo(pointf, CV_32F); 16 17 return fitEllipse(pointf); 18 }(); 19 //ここから何を追加していいのか分からない 20 21 return Output;//Output :最大領域のみ抽出したMat型 22}

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

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

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2017 Community
OpenCV 3.4.0

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

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

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

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

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

episteme

2018/01/10 06:49

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

2018/01/10 07:11

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

2018/01/10 07:21

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

2018/01/10 07:34

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

回答2

0

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

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

投稿2018/01/10 08:07

編集2018/01/10 08:23
episteme

総合スコア16614

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

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

Tomo29

2018/01/10 08:18

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

2018/01/10 08:22

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

2018/01/10 08:40

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

2018/01/10 12:22

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

2018/01/10 13:47

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

0

自己解決

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

投稿2018/01/15 04:01

Tomo29

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問