質問編集履歴

2

書式の改善

2017/11/05 06:20

投稿

shutein
shutein

スコア14

test CHANGED
@@ -1 +1 @@
1
- OpenCVを使ったテンプレートマッチングの画像の読み込み
1
+ OpenCVを使ったテンプレートマッチングの画像の読み込みが出来ません
test CHANGED
@@ -1,10 +1,16 @@
1
1
  ###前提・実現したいこと
2
2
 
3
- androidstudioとOpenCVを使って色抽出とテンプレートマッチングを組み合わせて赤い丸を探すプログラムを開発しています。
3
+ androidstudioとOpenCVを使って色抽出とテンプレートマッチングを組み合わせて
4
+
4
-
5
+ 赤い丸を探すプログラムを開発しています。
6
+
7
+
8
+
5
-
9
+ 実現したい事としては
10
+
6
-
11
+ マッチングする対象の画像は画面に表示されている「m_temp」で
12
+
7
- 実現したい事としてはマッチングする対象の画像は画面に表示されている「m_temp」でそれをandroidstudio内のsrcフォルダのdrawableに入っている画像とマッチングをしたいです。
13
+ それをandroidstudio内のsrcフォルダのdrawableに入っている画像とマッチングをしたいです。
8
14
 
9
15
 
10
16
 
@@ -12,178 +18,180 @@
12
18
 
13
19
  ###発生している問題・エラーメッセージ
14
20
 
15
- こちらのサイト「[OpenCVのテンプレートマッチングで複数検出](http://workpiles.com/2015/05/opencv-matchtemplate-java/)」を参考に記述したところコード内にはエラーは出ていなかったのですが実行するとエラーが発生し、実機で動かすとマッチングの直前(画面をタッチすると)で落ちてしまいます。
21
+ こちらのサイト「[OpenCVのテンプレートマッチングで複数検出](http://workpiles.com/2015/05/opencv-matchtemplate-java/)」を参考に記述したところ
22
+
23
+ コード内にはエラーは出ていなかったのですが実行するとエラーが発生し、
24
+
25
+ 実機の動作としてはマッチングの直前(画面をタッチすると)で落ちてしまいます。
16
26
 
17
27
 
18
28
 
19
29
  テンプレートマッチングはまだ勉強を始めたばかりなので具体的に教えて頂きたいです。
20
30
 
31
+ ```
32
+
33
+ FATAL EXCEPTION: Thread-3
34
+
35
+ Process: com.example.color2, PID: 6904
36
+
37
+ CvException [org.opencv.core.CvException: cv::Exception: /build/master_pack-android/opencv/modules/imgproc/src/templmatch.cpp:664: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int)
38
+
39
+ ]
40
+
41
+ at org.opencv.imgproc.Imgproc.matchTemplate_1(Native Method)
42
+
43
+ at org.opencv.imgproc.Imgproc.matchTemplate(Imgproc.java:2452)
44
+
45
+ at com.example.color2.MainActivity.onCameraFrame(MainActivity.java:162)
46
+
47
+ at org.opencv.android.CameraBridgeViewBase$CvCameraViewListenerAdapter.onCameraFrame(CameraBridgeViewBase.java:163)
48
+
49
+ at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:399)
50
+
51
+ at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:352)
52
+
53
+ at java.lang.Thread.run(Thread.java:776)
54
+
21
55
  ```
22
56
 
23
- エラーメッセージ
24
-
25
- FATAL EXCEPTION: Thread-3
26
-
27
- Process: com.example.color2, PID: 6904
28
-
29
- CvException [org.opencv.core.CvException: cv::Exception: /build/master_pack-android/opencv/modules/imgproc/src/templmatch.cpp:664: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int)
30
-
31
- ]
32
-
33
- at org.opencv.imgproc.Imgproc.matchTemplate_1(Native Method)
34
-
35
- at org.opencv.imgproc.Imgproc.matchTemplate(Imgproc.java:2452)
36
-
37
- at com.example.color2.MainActivity.onCameraFrame(MainActivity.java:162)
38
-
39
- at org.opencv.android.CameraBridgeViewBase$CvCameraViewListenerAdapter.onCameraFrame(CameraBridgeViewBase.java:163)
40
-
41
- at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:399)
42
-
43
- at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:352)
44
-
45
- at java.lang.Thread.run(Thread.java:776)
57
+
58
+
59
+ ###該当のソースコード
60
+
61
+ ```Java
62
+
63
+ private Mat m_temp; //抽出結果の画像
64
+
65
+
66
+
67
+ public Mat onCameraFrame(Mat inputFrame) {
68
+
69
+ Mat src = inputFrame;
70
+
71
+ Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
72
+
73
+ Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);
74
+
75
+ //赤ボールペンならこのあたり 紫っぽい暗い赤ならこんな感じ *オレンジは反応しない
76
+
77
+ Mat src2 = dst;
78
+
79
+ Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
80
+
81
+ Scalar low = new Scalar(165, 20, 30);//下限  変更前(10,20,30) S,Vはあまり変えない方が良い?
82
+
83
+ Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255)
84
+
85
+ Core.inRange(src2, low, high, dst2);//色抽出
86
+
87
+ // return dst2; }} ←色だけならここ
88
+
89
+
90
+
91
+ //画面をタッチすると表示画面が保持される
92
+
93
+ if (touId > 1) {
94
+
95
+ //return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ //対象画像とテンプレート画像を読み込み
104
+
105
+ Mat img = m_temp;
106
+
107
+ Mat tmpl = Imgcodecs.imread("./circle.png");
108
+
109
+
110
+
111
+ //比較結果を格納するMatを生成
112
+
113
+ Mat result = new Mat(img.rows() - tmpl.rows() + 1, img.cols() - tmpl.cols() + 1, CvType.CV_32FC1);
114
+
115
+
116
+
117
+ Imgproc.matchTemplate(img, tmpl, result, Imgproc.TM_CCOEFF_NORMED); //テンプレートマッチング
118
+
119
+ Imgproc.threshold(result, result, 0.8, 1.0, Imgproc.THRESH_TOZERO); // 検出結果から相関係数がしきい値以下の部分を削除
120
+
121
+ // テンプレート画像の部分を元画像に赤色の矩形で囲む
122
+
123
+ for (int i=0;i<result.rows();i++) {
124
+
125
+ for (int j=0;j<result.cols();j++) {
126
+
127
+ if (result.get(i, j)[0] > 0) {
128
+
129
+ Imgproc.rectangle(img, new Point(j, i), new Point(j + tmpl.cols(), i + tmpl.rows()), new Scalar(0, 0, 255));
130
+
131
+ }
132
+
133
+ }
134
+
135
+ }
136
+
137
+ System.out.println("output test.jpg");
138
+
139
+ Imgcodecs.imwrite("test.jpg", img); //画像の出力
140
+
141
+ }
142
+
143
+
144
+
145
+ if (touId == 1) {
146
+
147
+ touId++;
148
+
149
+ m_temp = dst2; //抽出結果を保持する
150
+
151
+ }
152
+
153
+ return dst2;
154
+
155
+ }
156
+
157
+ //タッチが2回でreturnを止めたいが、ifの外にreturnが無いからエラーが出る
158
+
159
+
160
+
161
+ @Override
162
+
163
+ public boolean onTouchEvent(MotionEvent ev) {
164
+
165
+ switch (ev.getAction()) {
166
+
167
+ case ACTION_DOWN:
168
+
169
+ //画面がタッチされたときの動作
170
+
171
+ if (touId == 0) {
172
+
173
+ touId = 1;
174
+
175
+ }
176
+
177
+ break;
178
+
179
+ case MotionEvent.ACTION_CANCEL:
180
+
181
+ //他の要因によってタッチがキャンセルされたときの動作
182
+
183
+ break;
184
+
185
+ }
186
+
187
+ return super.onTouchEvent(ev);
188
+
189
+ }
46
190
 
47
191
  ```
48
192
 
49
193
 
50
194
 
51
- ###該当のソースコード
52
-
53
- ```Java
54
-
55
- private Mat m_temp; //抽出結果の画像
56
-
57
-
58
-
59
- public Mat onCameraFrame(Mat inputFrame) {
60
-
61
- Mat src = inputFrame;
62
-
63
- Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
64
-
65
- Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);
66
-
67
- //赤ボールペンならこのあたり 紫っぽい暗い赤ならこんな感じ *オレンジは反応しない
68
-
69
- Mat src2 = dst;
70
-
71
- Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
72
-
73
- Scalar low = new Scalar(165, 20, 30);//下限  変更前(10,20,30) S,Vはあまり変えない方が良い?
74
-
75
- Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255)
76
-
77
- Core.inRange(src2, low, high, dst2);//色抽出
78
-
79
- // return dst2; }} ←色だけならここ
80
-
81
-
82
-
83
- //画面をタッチすると表示画面が保持される
84
-
85
- if (touId > 1) {
86
-
87
- //return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
- //対象画像とテンプレート画像を読み込み
96
-
97
- Mat img = m_temp;
98
-
99
- Mat tmpl = Imgcodecs.imread("./circle.png");
100
-
101
-
102
-
103
- //比較結果を格納するMatを生成
104
-
105
- Mat result = new Mat(img.rows() - tmpl.rows() + 1, img.cols() - tmpl.cols() + 1, CvType.CV_32FC1);
106
-
107
-
108
-
109
- Imgproc.matchTemplate(img, tmpl, result, Imgproc.TM_CCOEFF_NORMED); //テンプレートマッチング
110
-
111
- Imgproc.threshold(result, result, 0.8, 1.0, Imgproc.THRESH_TOZERO); // 検出結果から相関係数がしきい値以下の部分を削除
112
-
113
- // テンプレート画像の部分を元画像に赤色の矩形で囲む
114
-
115
- for (int i=0;i<result.rows();i++) {
116
-
117
- for (int j=0;j<result.cols();j++) {
118
-
119
- if (result.get(i, j)[0] > 0) {
120
-
121
- Imgproc.rectangle(img, new Point(j, i), new Point(j + tmpl.cols(), i + tmpl.rows()), new Scalar(0, 0, 255));
122
-
123
- }
124
-
125
- }
126
-
127
- }
128
-
129
- System.out.println("output test.jpg");
130
-
131
- Imgcodecs.imwrite("test.jpg", img); //画像の出力
132
-
133
- }
134
-
135
-
136
-
137
- if (touId == 1) {
138
-
139
- touId++;
140
-
141
- m_temp = dst2; //抽出結果を保持する
142
-
143
- }
144
-
145
- return dst2;
146
-
147
- }
148
-
149
- //タッチが2回でreturnを止めたいが、ifの外にreturnが無いからエラーが出る
150
-
151
-
152
-
153
- @Override
154
-
155
- public boolean onTouchEvent(MotionEvent ev) {
156
-
157
- switch (ev.getAction()) {
158
-
159
- case ACTION_DOWN:
160
-
161
- //画面がタッチされたときの動作
162
-
163
- if (touId == 0) {
164
-
165
- touId = 1;
166
-
167
- }
168
-
169
- break;
170
-
171
- case MotionEvent.ACTION_CANCEL:
172
-
173
- //他の要因によってタッチがキャンセルされたときの動作
174
-
175
- break;
176
-
177
- }
178
-
179
- return super.onTouchEvent(ev);
180
-
181
- }
182
-
183
- ```
184
-
185
-
186
-
187
195
  ###試したこと
188
196
 
189
197
  エラー箇所をさがしてみると、画像の読み込みの部分が上手く動いていないようでした。

1

説明の補足をしました。

2017/11/05 06:20

投稿

shutein
shutein

スコア14

test CHANGED
@@ -1 +1 @@
1
- OpenCVを使ったテンプレートマッチングの画像読み込み
1
+ OpenCVを使ったテンプレートマッチングの画像読み込み
test CHANGED
@@ -4,9 +4,15 @@
4
4
 
5
5
 
6
6
 
7
+ 実現したい事としてはマッチングする対象の画像は画面に表示されている「m_temp」でそれをandroidstudio内のsrcフォルダのdrawableに入っている画像とマッチングをしたいです。
8
+
9
+
10
+
11
+
12
+
7
13
  ###発生している問題・エラーメッセージ
8
14
 
9
- 現在、テンプレートマッチングに取り組んでいてこちらのサイト「[OpenCVのテンプレートマッチングで複数検出](http://workpiles.com/2015/05/opencv-matchtemplate-java/)」を参考に記述したところコード内にはエラーは出ていなかったのですが実行するとエラーが発生し、実機で動かすとマッチングの直前(画面をタッチすると)で落ちてしまいます。
15
+ こちらのサイト「[OpenCVのテンプレートマッチングで複数検出](http://workpiles.com/2015/05/opencv-matchtemplate-java/)」を参考に記述したところコード内にはエラーは出ていなかったのですが実行するとエラーが発生し、実機で動かすとマッチングの直前(画面をタッチすると)で落ちてしまいます。
10
16
 
11
17
 
12
18
 
@@ -180,7 +186,9 @@
180
186
 
181
187
  ###試したこと
182
188
 
183
- 原因分かっないですが一つ、画像の読み込みが出来ていない可能性があるらいのですが解決法が分からないです
189
+ エラー箇所をさみると、画像の読み込みの部分上手く動いていないようで
190
+
191
+ ですがどのように直せばよいのか分からないです。
184
192
 
185
193
 
186
194