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

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

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

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

OpenCV

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

C++

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

Q&A

解決済

1回答

1831閲覧

背景差分画像の取得について

beginner46

総合スコア8

Visual Studio

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

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/08/08 04:08

編集2018/08/10 19:52

静止画像中の特定の物体の色を変えたく、まず物体だけを取り出そうと、前景抽出のプログラム(Grabcutを用いました)をopencvで実装してみたのですが、物体じゃない部分も認識されてしまいます(単純な画像ですと、綺麗に前景抽出されます)。

綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。

C++

1#include"stdafx.h" 2#pragma comment(lib,"opencv_world341d.lib") 3#include <iostream> 4#include<opencv2/opencv.hpp> 5#include<opencv2/core/core.hpp> 6#include<opencv2/highgui/highgui.hpp> 7#include <opencv2/imgproc.hpp> 8 9using namespace cv; 10using namespace std; 11 12int main() 13{ 14 // Open another image 15 Mat image; 16 image = cv::imread("ポスト.bmp"); 17 18 if (!image.data) // Check for invalid input 19 { 20 cout << "Could not open or find the image" << std::endl; 21 return -1; 22 } 23 24 // define bounding rectangle 25 //int border = 100; 26 //int border2 = border + border; 27 //cv::Rect rectangle(100, 100, image.cols - border2, image.rows - border2); 28 cv::Rect rectangle(170, 100, 300, 800); 29 30 cv::Mat result; // segmentation result (4 possible values) 31 cv::Mat bgModel, fgModel; // the models (internally used) 32 33 // GrabCut segmentation 34 cv::grabCut(image, // input image 35 result, // segmentation result 36 rectangle,// rectangle containing foreground 37 bgModel, fgModel, // models 38 1, // number of iterations 39 cv::GC_INIT_WITH_RECT); // use rectangle 40 // Get the pixels marked as likely foreground 41 cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ); 42 // Generate output image 43 cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(0, 255, 255)); 44 image.copyTo(foreground, result); // bg pixels not copied 45 46 // draw rectangle on original image 47 cv::rectangle(image, rectangle, cv::Scalar(0, 255, 255), 1); 48 cv::namedWindow("Image"); 49 cv::imshow("Image", image); 50 51 // display result 52 cv::namedWindow("Segmented Image"); 53 cv::imshow("Segmented Image", foreground); 54 55 56 waitKey(); 57 return 0; 58 59}

以上がプログラムで、以下が前景抽出前と、抽出後の得られた画像です。

結果画像

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

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

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

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

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

Ryupe

2018/08/09 05:16 編集

まずあなたが書いたプログラムと実行前と後の画像を掲示してもらえますか?
beginner46

2018/08/09 07:37

ご指摘をいただきましてありがとうございます。ソースコードと結果画像を追加しました。大変失礼いたしました。
Ryupe

2018/08/09 08:02

>>どうぞ宜しくお願い致します。```C++ ←ソースコードが乱れてしまっているので改行してくださいね。あと、こんなこと言って申し訳ないんですがてっきりpythonで書いているのかと思ったら違いました。タグをよく見ていませんでした。しかし、まぁまぁ綺麗に切り取れてますね!
guest

回答1

0

ベストアンサー

まず物体だけを取り出そうと、前景抽出のプログラム(Grabcutを用いました)をopencvで実装してみたのですが、物体じゃない部分も認識されてしまいます

チュートリアル GrabCutを使った対話的前景領域抽出 にも説明がありますが、GrabCutアルゴリズムは "対話的" 、つまりユーザ(=あなた)からの補助情報・アドバイスに基づいて前景抽出精度を上げるものです。

綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。

上記チュートリアルの"課題"が参考になるかと思います。

OpenCVのサンプルに含まれているgrabcut.pyはGrabCutを使った対話ツールです.確認してください.使用方法については,この youtube video http://www.youtube.com/watch?v=kAwxLTDDAwU を見てください.

投稿2018/08/13 01:28

yohhoy

総合スコア6189

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問