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

回答編集履歴

3

追記

2021/08/06 07:12

投稿

fana
fana

スコア12229

answer CHANGED
@@ -14,4 +14,51 @@
14
14
  ---
15
15
 
16
16
  参考:[五線譜を見つける話](https://teratail.com/questions/157778)が過去にあった.
17
- 話としては概ね同じじゃないかな.
17
+ 話としては概ね同じじゃないかな.
18
+
19
+ ---
20
+
21
+ 「各y座標について,その行の黒い画素の個数を数えて一定以上なら赤線を描画してみる」を愚直にやるだけで以下のような結果になる.
22
+ (※「線がどこにあるのかわからない」状態で処理するために,適当に白い余白を追加した絵を入力画像としている)
23
+ (※赤線が見やすいように,適当に暗くした画像の上に線を描画した)
24
+
25
+ * 縦方向についても同様にやれば良い.
26
+ * 線を描く太さを適当に太くしてやるとかすれば所望の結果になるかも.
27
+
28
+ ```C++
29
+ int main()
30
+ {
31
+ cv::Mat SrcImg = cv::imread( "OthelloWithBorder.png" );
32
+ if( SrcImg.empty() )return 0;
33
+ cv::Mat GrayImg = cv::Mat( SrcImg.size(), CV_8UC1 );
34
+ cv::cvtColor( SrcImg, GrayImg, cv::COLOR_BGR2GRAY );
35
+
36
+ const unsigned int IdealLineLength = 412;
37
+ const unsigned int nThresh = (int)( IdealLineLength * 0.85 );
38
+ const unsigned char GrayThresh = 60;
39
+
40
+ cv::Mat ShowImg = SrcImg * 0.25;
41
+ for( int y=0; y<GrayImg.rows; ++y )
42
+ {
43
+ unsigned int n = 0;
44
+ int Left = GrayImg.cols;
45
+ int Right = 0;
46
+ const unsigned char *p = GrayImg.ptr<unsigned char>( y );
47
+ for( int x=0; x<GrayImg.cols; ++x, ++p )
48
+ {
49
+ if( *p < GrayThresh )
50
+ {
51
+ Left = std::min( Left,x );
52
+ Right = x;
53
+ ++n;
54
+ }
55
+ }
56
+ if( n >= nThresh )
57
+ { cv::line( ShowImg, cv::Point(Left,y), cv::Point(Right,y), cv::Scalar(0,0,255), 1 ); }
58
+ }
59
+ cv::imshow( "Result", ShowImg );
60
+ cv::waitKey();
61
+ return 0;
62
+ }
63
+ ```
64
+ ![イメージ説明](00ca73740da9f9d6b01c247938afc53c.png)

2

参考リンクを追記

2021/08/06 07:12

投稿

fana
fana

スコア12229

answer CHANGED
@@ -7,5 +7,11 @@
7
7
  その場合,至極簡単な方法としては,
8
8
  【「向き」の方向に沿って走査したときに黒画素の個数が「長さ」に非常に近いとき,その走査線上に線があるのだと判断する】
9
9
  という話が考えられます.
10
+ →線を見つけたらそこを赤で描画すればいい.
10
11
 
11
- 枠線の本数や間隔も事前知識として導入すれば,例えば「同じ個所に多重に線が出ちゃう」とかいう問題があっても対処できるでしょう.
12
+ 枠線の本数や間隔も事前知識として導入すれば,例えば「同じ個所に多重に線が出ちゃう」とかいう問題があっても対処できるでしょう.
13
+
14
+ ---
15
+
16
+ 参考:[五線譜を見つける話](https://teratail.com/questions/157778)が過去にあった.
17
+ 話としては概ね同じじゃないかな.

1

言葉をおぎなう

2021/08/06 02:01

投稿

fana
fana

スコア12229

answer CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  を決め打ちで処理できるでしょう.
7
7
  その場合,至極簡単な方法としては,
8
- 【「向き」の方向に沿って走査したときに黒画素が「長さ」に非常に近いとき,その走査線上に線があるのだと判断する】
8
+ 【「向き」の方向に沿って走査したときに黒画素の個数が「長さ」に非常に近いとき,その走査線上に線があるのだと判断する】
9
9
  という話が考えられます.
10
10
 
11
11
  枠線の本数や間隔も事前知識として導入すれば,例えば「同じ個所に多重に線が出ちゃう」とかいう問題があっても対処できるでしょう.