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

回答編集履歴

1

やってみたのを追記

2021/08/06 06:17

投稿

fana
fana

スコア12225

answer CHANGED
@@ -6,4 +6,41 @@
6
6
  (入力画像に対する相応の事前知識を用いて良いならば,ですが,)
7
7
  示されているような入力画像においては
8
8
  「画像上での各マスの中央位置」というのは簡単に求めることができる(≒「既知」と言える)のではないのでしょうか?
9
- あとは単にそれぞれの場所の色を相応に見てやればよいだけでしょう.
9
+ あとは単にそれぞれの場所の色を相応に見てやればよいだけでしょう.
10
+
11
+ ---
12
+
13
+ 以下の例では,マスの中央っぽい場所の1pixelだけを見ていますが,必要に応じて少し広い範囲を見て判断する等すれば良いでしょう.
14
+ (`ShowImg` は単に見ている場所を視覚化するための物で,処理には無関係)
15
+
16
+ ```C++
17
+ int main()
18
+ {
19
+ cv::Mat SrcImg = cv::imread( "Othello.png", cv::IMREAD_GRAYSCALE );
20
+ if( SrcImg.empty() )return 0;
21
+
22
+ cv::Mat ShowImg = cv::Mat::zeros( SrcImg.size(), CV_8UC3 );
23
+ cv::cvtColor( SrcImg, ShowImg, cv::COLOR_GRAY2BGR );
24
+
25
+ cv::threshold( SrcImg, SrcImg, 127, 255, cv::THRESH_BINARY );
26
+ const double UnitW = SrcImg.cols / 8.0;
27
+ const double UnitH = SrcImg.rows / 8.0;
28
+ for( int y=0; y<8; ++y )
29
+ {
30
+ int PosY = cvRound( (y+0.5)*UnitH );
31
+ for( int x=0; x<8; ++x )
32
+ {
33
+ int PosX = cvRound( (x+0.5)*UnitW );
34
+ bool IsWhite =( SrcImg.at<unsigned char>(PosY,PosX) > 127 );
35
+ std::cout << ( IsWhite ? "白" : "黒" );
36
+ cv::circle( ShowImg, cv::Point(PosX,PosY), 3, cv::Scalar(0,0,255), -1 );
37
+ }
38
+ std::cout << std::endl;
39
+ }
40
+ cv::imshow( "ShowImg", ShowImg );
41
+ cv::waitKey();
42
+ return 0;
43
+ }
44
+ ```
45
+
46
+ ![イメージ説明](9149c3042e35751aa0bf33de09021491.png)