質問編集履歴
2
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,66 @@
|
|
1
|
-
C++で
|
1
|
+
C++でソベルフィルタを実装したいのですが実行時に処理が終わらないです。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
```C++
|
6
|
+
|
7
|
+
#include <opencv2/opencv.hpp>
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
int main() {
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
// 画像の入力
|
16
|
+
|
17
|
+
cv::Mat input_image = cv::imread("input.jpg", 0);
|
18
|
+
|
19
|
+
cv::Mat sobel_image, output_image;
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
/* Sobelフィルタ (3×3)
|
24
|
+
|
25
|
+
-1 0 1
|
26
|
+
|
27
|
+
-2 0 2
|
28
|
+
|
29
|
+
-1 0 1 */
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
// Sobelフィルタの処理(入力画像,出力画像,出力タイプ,x方向の微分次数,y方向の微分次数,フィルタサイズ)
|
34
|
+
|
35
|
+
cv::Sobel(input_image, sobel_image, CV_32F, 1, 0, 3); // x方向の微分フィルタ
|
36
|
+
|
37
|
+
// cv::Sobel(input_image, sobel_image, CV_32F, 0, 1, 3); // y方向の微分フィルタ
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
// convertScaleAbs(=スケーリング後に絶対値を計算し,結果を8ビットに変換)
|
42
|
+
|
43
|
+
cv::convertScaleAbs(sobel_image, output_image, 1, 0);
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
// 閾値以上の場合にエッジ(=白)と見なす(入力画像,出力画像,閾値,最大値,閾値タイプ)
|
48
|
+
|
49
|
+
// cv::threshold(output_image, output_image, 64, 255, cv::THRESH_BINARY);
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
// 画像の保存と表示
|
54
|
+
|
55
|
+
cv::imwrite("output.jpg", output_image);
|
56
|
+
|
57
|
+
cv::waitKey();
|
58
|
+
|
59
|
+
return 0;
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
```
|
2
64
|
|
3
65
|
|
4
66
|
|
1
原因
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,75 +1,15 @@
|
|
1
1
|
C++でOpenCVを使わないで、ソベルフィルタを実装したいのですが実行時に処理が終わらないです。
|
2
|
-
|
3
|
-
何が間違っているのか教えてください。
|
4
|
-
|
5
|
-
プログラムはこのようにしました。
|
6
|
-
|
7
|
-
```C++
|
8
|
-
|
9
|
-
#include <iostream>
|
10
|
-
|
11
|
-
#include <opencv2/opencv.hpp>
|
12
|
-
|
13
|
-
int main()
|
14
|
-
|
15
|
-
{
|
16
|
-
|
17
|
-
// 画像を格納するオブジェクトを宣言する
|
18
|
-
|
19
|
-
cv::Mat_<uchar> src, out;
|
20
|
-
|
21
|
-
// 画像ファイルから画像データを読み込む
|
22
|
-
|
23
|
-
src = cv::imread("/Users/Desktop/test.jpg", cv::IMREAD_GRAYSCALE);
|
24
|
-
|
25
|
-
// srcと同じサイズで画像を作成する。初期値を0にする。
|
26
|
-
|
27
|
-
out = cv::Mat_<uchar>(src.size(), 0);
|
28
|
-
|
29
|
-
// ソベルフィルタ
|
30
|
-
|
31
|
-
for (int y = 1; y < src.rows - 1; y++) {
|
32
|
-
|
33
|
-
for (int x = 1; x < src.cols - 1; x++) {
|
34
|
-
|
35
|
-
int fx,fy;
|
36
|
-
|
37
|
-
double sum, value;
|
38
|
-
|
39
|
-
fx= -src(y-1,x-1)+ src(y-1,x+1)
|
40
|
-
|
41
|
-
-2*src(y, x - 1)+ 2 * src(y, x + 1)
|
42
|
-
|
43
|
-
-src(y+1,x-1) + src(y + 1, x + 1);
|
44
|
-
|
45
|
-
fy= -src(y-1,x-1)-2*src(y-1,x)-src(y-1,x+1)
|
46
|
-
|
47
|
-
+src(y+1,x-1)+2*src(y+1,x)+src(y+1,x+1);
|
48
2
|
|
49
3
|
|
50
4
|
|
51
|
-
|
5
|
+
追記
|
52
6
|
|
53
|
-
value = sqrt(sum);
|
54
|
-
|
55
|
-
|
7
|
+
終わらなかったのは、末尾に
|
56
|
-
|
57
|
-
value = abs(value);
|
58
|
-
|
59
|
-
out(y, x) = cv::saturate_cast<uchar>(value);
|
60
|
-
|
61
|
-
}
|
62
|
-
|
63
|
-
}
|
64
|
-
|
65
|
-
cv::imwrite("result.jpg", out); //結果出力
|
66
|
-
|
67
|
-
cv::waitKey(); //入力待ち
|
68
|
-
|
69
|
-
return 0;
|
70
|
-
|
71
|
-
}
|
72
8
|
|
73
9
|
```
|
74
10
|
|
11
|
+
cv::waitKey();
|
12
|
+
|
13
|
+
```
|
14
|
+
|
75
|
-
|
15
|
+
を入れていたためでした。
|