回答編集履歴

3

結果画像わすれてた

2021/08/23 01:30

投稿

fana
fana

スコア11658

test CHANGED
@@ -99,3 +99,9 @@
99
99
  }
100
100
 
101
101
  ```
102
+
103
+
104
+
105
+ 結果:
106
+
107
+ ![イメージ説明](3d98561962af237f09b108cdc21b2d29.png)

2

追記

2021/08/23 01:30

投稿

fana
fana

スコア11658

test CHANGED
@@ -19,3 +19,83 @@
19
19
  →コマンドライン引数では「何を」与える仕様としているのですか?
20
20
 
21
21
  コマンドライン引数の使われ方を見るとちょっと謎です(コーナーの点の個数として使われているが,objPtsの座標値にも用いられている.これは正しいの?)
22
+
23
+
24
+
25
+ ---
26
+
27
+
28
+
29
+ 参考までに,最も単純なコードを示す.
30
+
31
+
32
+
33
+ * 入力画像はサイズがでかかったので適当に縮小した
34
+
35
+ * チェスボードパターンの四隅座標は,当該縮小した画像上で手作業(目視)で求めたものをハードコーディングしてある
36
+
37
+ * warpPerspective で WARP_INVERSE_MAP を使ってない
38
+
39
+
40
+
41
+ ```C++
42
+
43
+ int main()
44
+
45
+ {
46
+
47
+ //※"Board.png"は質問に貼られていた画像を縦横半分に縮小したものを使用した
48
+
49
+ cv::Mat SrcImg = cv::imread( "Board.png" );
50
+
51
+ if( SrcImg.empty() )return 0;
52
+
53
+
54
+
55
+ //SrcImg 上のチェスボードパターンの四隅の座標
56
+
57
+ cv::Point2f ImgPts[4] = {
58
+
59
+ { 218, 267 }, { 385, 267 }, { 196, 375 }, { 406, 373 }
60
+
61
+ };
62
+
63
+
64
+
65
+ //↑の4点の変換結果目標座標.
66
+
67
+ //320*240サイズの結果画像の四隅から少し(10[pixel])だけ内側.
68
+
69
+ cv::Mat ResultImg = cv::Mat::zeros( 240, 320, CV_8UC3 );
70
+
71
+ cv::Point2f ObjPts[4] = {
72
+
73
+ { 10,10 }, { 310, 10, }, { 10, 230 }, { 310, 230 }
74
+
75
+ };
76
+
77
+
78
+
79
+ cv::Mat H = cv::getPerspectiveTransform( ImgPts, ObjPts );
80
+
81
+ cv::warpPerspective(
82
+
83
+ SrcImg, ResultImg,
84
+
85
+ H, ResultImg.size(),
86
+
87
+ cv::INTER_LINEAR, cv::BORDER_CONSTANT,
88
+
89
+ cv::Scalar::all(0)
90
+
91
+ );
92
+
93
+ cv::imshow( "Result", ResultImg );
94
+
95
+ cv::waitKey();
96
+
97
+ return 0;
98
+
99
+ }
100
+
101
+ ```

1

訂正

2021/08/23 01:29

投稿

fana
fana

スコア11658

test CHANGED
@@ -6,7 +6,9 @@
6
6
 
7
7
 
8
8
 
9
- * 引数の順序はこれで正しいですか?
9
+ * ~~引数の順序はこれで正しいですか?~~
10
+
11
+ (→後段で WARP_INVERSE_MAP を使っているから,これは正しい模様)
10
12
 
11
13
  * objPts と imgPts の4点の対応関係は正しいですか?
12
14