teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

2018/08/10 19:53

投稿

beginner46
beginner46

スコア8

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,3 @@
1
- ```ここに言語を入力
2
- コード
3
- ```はじめまして。プログラミング初心者の学生です。
4
-
5
1
  静止画像中の特定の物体の色を変えたく、まず物体だけを取り出そうと、前景抽出のプログラム(Grabcutを用いました)をopencvで実装してみたのですが、物体じゃない部分も認識されてしまいます(単純な画像ですと、綺麗に前景抽出されます)。
6
2
 
7
3
  綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。

2

2018/08/10 19:52

投稿

beginner46
beginner46

スコア8

title CHANGED
File without changes
body CHANGED
@@ -1,8 +1,13 @@
1
+ ```ここに言語を入力
2
+ コード
1
- はじめまして。プログラミング初心者の学生です。
3
+ ```はじめまして。プログラミング初心者の学生です。
2
4
 
3
5
  静止画像中の特定の物体の色を変えたく、まず物体だけを取り出そうと、前景抽出のプログラム(Grabcutを用いました)をopencvで実装してみたのですが、物体じゃない部分も認識されてしまいます(単純な画像ですと、綺麗に前景抽出されます)。
4
6
 
5
- 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。```C++
7
+ 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。
8
+
9
+
10
+ ```C++
6
11
  #include"stdafx.h"
7
12
  #pragma comment(lib,"opencv_world341d.lib")
8
13
  #include <iostream>

1

プログラムと結果画像を追加しました。

2018/08/10 19:52

投稿

beginner46
beginner46

スコア8

title CHANGED
File without changes
body CHANGED
@@ -2,4 +2,68 @@
2
2
 
3
3
  静止画像中の特定の物体の色を変えたく、まず物体だけを取り出そうと、前景抽出のプログラム(Grabcutを用いました)をopencvで実装してみたのですが、物体じゃない部分も認識されてしまいます(単純な画像ですと、綺麗に前景抽出されます)。
4
4
 
5
- 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。
5
+ 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。```C++
6
+ #include"stdafx.h"
7
+ #pragma comment(lib,"opencv_world341d.lib")
8
+ #include <iostream>
9
+ #include<opencv2/opencv.hpp>
10
+ #include<opencv2/core/core.hpp>
11
+ #include<opencv2/highgui/highgui.hpp>
12
+ #include <opencv2/imgproc.hpp>
13
+
14
+ using namespace cv;
15
+ using namespace std;
16
+
17
+ int main()
18
+ {
19
+ // Open another image
20
+ Mat image;
21
+ image = cv::imread("ポスト.bmp");
22
+
23
+ if (!image.data) // Check for invalid input
24
+ {
25
+ cout << "Could not open or find the image" << std::endl;
26
+ return -1;
27
+ }
28
+
29
+ // define bounding rectangle
30
+ //int border = 100;
31
+ //int border2 = border + border;
32
+ //cv::Rect rectangle(100, 100, image.cols - border2, image.rows - border2);
33
+ cv::Rect rectangle(170, 100, 300, 800);
34
+
35
+ cv::Mat result; // segmentation result (4 possible values)
36
+ cv::Mat bgModel, fgModel; // the models (internally used)
37
+
38
+ // GrabCut segmentation
39
+ cv::grabCut(image, // input image
40
+ result, // segmentation result
41
+ rectangle,// rectangle containing foreground
42
+ bgModel, fgModel, // models
43
+ 1, // number of iterations
44
+ cv::GC_INIT_WITH_RECT); // use rectangle
45
+ // Get the pixels marked as likely foreground
46
+ cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
47
+ // Generate output image
48
+ cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(0, 255, 255));
49
+ image.copyTo(foreground, result); // bg pixels not copied
50
+
51
+ // draw rectangle on original image
52
+ cv::rectangle(image, rectangle, cv::Scalar(0, 255, 255), 1);
53
+ cv::namedWindow("Image");
54
+ cv::imshow("Image", image);
55
+
56
+ // display result
57
+ cv::namedWindow("Segmented Image");
58
+ cv::imshow("Segmented Image", foreground);
59
+
60
+
61
+ waitKey();
62
+ return 0;
63
+
64
+ }
65
+ ```
66
+
67
+ 以上がプログラムで、以下が前景抽出前と、抽出後の得られた画像です。
68
+
69
+ ![結果画像](b3405c69f5cd5838c70513f8d4dbb369.png)