質問編集履歴

3

2018/08/10 19:53

投稿

beginner46
beginner46

スコア8

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

2

2018/08/10 19:52

投稿

beginner46
beginner46

スコア8

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,8 @@
1
+ ```ここに言語を入力
2
+
3
+ コード
4
+
1
- はじめまして。プログラミング初心者の学生です。
5
+ ```はじめまして。プログラミング初心者の学生です。
2
6
 
3
7
 
4
8
 
@@ -6,7 +10,13 @@
6
10
 
7
11
 
8
12
 
9
- 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。```C++
13
+ 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。
14
+
15
+
16
+
17
+
18
+
19
+ ```C++
10
20
 
11
21
  #include"stdafx.h"
12
22
 

1

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

2018/08/10 19:52

投稿

beginner46
beginner46

スコア8

test CHANGED
File without changes
test CHANGED
@@ -6,4 +6,132 @@
6
6
 
7
7
 
8
8
 
9
- 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。
9
+ 綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。```C++
10
+
11
+ #include"stdafx.h"
12
+
13
+ #pragma comment(lib,"opencv_world341d.lib")
14
+
15
+ #include <iostream>
16
+
17
+ #include<opencv2/opencv.hpp>
18
+
19
+ #include<opencv2/core/core.hpp>
20
+
21
+ #include<opencv2/highgui/highgui.hpp>
22
+
23
+ #include <opencv2/imgproc.hpp>
24
+
25
+
26
+
27
+ using namespace cv;
28
+
29
+ using namespace std;
30
+
31
+
32
+
33
+ int main()
34
+
35
+ {
36
+
37
+ // Open another image
38
+
39
+ Mat image;
40
+
41
+ image = cv::imread("ポスト.bmp");
42
+
43
+
44
+
45
+ if (!image.data) // Check for invalid input
46
+
47
+ {
48
+
49
+ cout << "Could not open or find the image" << std::endl;
50
+
51
+ return -1;
52
+
53
+ }
54
+
55
+
56
+
57
+ // define bounding rectangle
58
+
59
+ //int border = 100;
60
+
61
+ //int border2 = border + border;
62
+
63
+ //cv::Rect rectangle(100, 100, image.cols - border2, image.rows - border2);
64
+
65
+ cv::Rect rectangle(170, 100, 300, 800);
66
+
67
+
68
+
69
+ cv::Mat result; // segmentation result (4 possible values)
70
+
71
+ cv::Mat bgModel, fgModel; // the models (internally used)
72
+
73
+
74
+
75
+ // GrabCut segmentation
76
+
77
+ cv::grabCut(image, // input image
78
+
79
+ result, // segmentation result
80
+
81
+ rectangle,// rectangle containing foreground
82
+
83
+ bgModel, fgModel, // models
84
+
85
+ 1, // number of iterations
86
+
87
+ cv::GC_INIT_WITH_RECT); // use rectangle
88
+
89
+ // Get the pixels marked as likely foreground
90
+
91
+ cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
92
+
93
+ // Generate output image
94
+
95
+ cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(0, 255, 255));
96
+
97
+ image.copyTo(foreground, result); // bg pixels not copied
98
+
99
+
100
+
101
+ // draw rectangle on original image
102
+
103
+ cv::rectangle(image, rectangle, cv::Scalar(0, 255, 255), 1);
104
+
105
+ cv::namedWindow("Image");
106
+
107
+ cv::imshow("Image", image);
108
+
109
+
110
+
111
+ // display result
112
+
113
+ cv::namedWindow("Segmented Image");
114
+
115
+ cv::imshow("Segmented Image", foreground);
116
+
117
+
118
+
119
+
120
+
121
+ waitKey();
122
+
123
+ return 0;
124
+
125
+
126
+
127
+ }
128
+
129
+ ```
130
+
131
+
132
+
133
+ 以上がプログラムで、以下が前景抽出前と、抽出後の得られた画像です。
134
+
135
+
136
+
137
+ ![結果画像](b3405c69f5cd5838c70513f8d4dbb369.png)