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

質問編集履歴

1

解決方法を追記した

2020/04/25 10:11

投稿

TAKASE_Hiroyuki
TAKASE_Hiroyuki

スコア21

title CHANGED
File without changes
body CHANGED
@@ -140,4 +140,116 @@
140
140
  0. 「あいまいな参照」とありますので、プレフィックスをつけようとするのですが、うまく認識してくれません。あいまいな参照を回避するには、どうすればよいのでしょうか。
141
141
  0. その他、正しく実行するためには、どうすればよろしいでしょうか。
142
142
 
143
- お手数ですが、教えていただければ幸いです。
143
+ お手数ですが、教えていただければ幸いです。
144
+
145
+ #追記・以下のとおり解決しました。
146
+ まず、コメントで教えていただいたとおり、OpenCvSharp4.Windows をインストールしました。
147
+ ![OpenCvSharp4.Windows](3095019b5ef4f24bc2c2dd61602d808d.png)
148
+ 次に、コードを次のように変更しました。
149
+ ```C#
150
+ using OpenCvSharp;
151
+ using OpenCvSharp.Extensions;
152
+ using System.Drawing;
153
+ using System.Drawing.Drawing2D;
154
+ using System.Windows.Forms;
155
+
156
+ namespace test21
157
+ {
158
+ public partial class Form1 : Form
159
+ {
160
+ public Form1()
161
+ {
162
+ InitializeComponent();
163
+
164
+ this.Size = new System.Drawing.Size(900, 750);
165
+
166
+ System.Drawing.Point px1 = new System.Drawing.Point(95, 95);
167
+ System.Drawing.Point px2 = new System.Drawing.Point(360, 32);
168
+ System.Drawing.Point px3 = new System.Drawing.Point(300, 240);
169
+ System.Drawing.Point px4 = new System.Drawing.Point(50, 200);
170
+
171
+ Image img = global::test21.Properties.Resources._400x300;
172
+
173
+ // 元の画像を表示
174
+ PictureBox p0 = new PictureBox();
175
+ p0.Image = img;
176
+ p0.Location = new System.Drawing.Point(30, 30);
177
+ p0.Size = new System.Drawing.Size(400, 300);
178
+ this.Controls.Add(p0);
179
+
180
+ // 元の画像に四角形を表示
181
+ PictureBox p1 = new PictureBox();
182
+ Bitmap bt1 = new Bitmap(400, 300);
183
+ Graphics gp1 = Graphics.FromImage(bt1);
184
+ gp1.DrawImage(img, 0, 0, 400, 300);
185
+
186
+ Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
187
+ skyBluePen.Width = 4.0F;
188
+
189
+ gp1.DrawLine(skyBluePen, px1, px2);
190
+ gp1.DrawLine(skyBluePen, px2, px3);
191
+ gp1.DrawLine(skyBluePen, px3, px4);
192
+ gp1.DrawLine(skyBluePen, px4, px1);
193
+
194
+ p1.Image = bt1;
195
+ p1.Location = new System.Drawing.Point(30, 360);
196
+ p1.Size = new System.Drawing.Size(400, 300);
197
+ this.Controls.Add(p1);
198
+
199
+ // 四角形で切り取って表示
200
+ System.Drawing.Point[] p2pt = { px1, px2, px3, px4 };
201
+ GraphicsPath p2path = new GraphicsPath();
202
+ p2path.AddPolygon(p2pt);
203
+ Region p2region = new Region(p2path);
204
+ Bitmap p2btm = new Bitmap(400, 300);
205
+ Graphics gp2 = Graphics.FromImage(p2btm);
206
+ gp2.Clip = p2region;
207
+ gp2.DrawImage(img, gp1.VisibleClipBounds);
208
+
209
+ PictureBox p2 = new PictureBox();
210
+ p2.Image = p2btm;
211
+ p2.Location = new System.Drawing.Point(450, 30);
212
+ p2.Size = new System.Drawing.Size(400, 300);
213
+ this.Controls.Add(p2);
214
+
215
+
216
+ // p2の四角形を引き伸ばして表示する
217
+ Mat src_img = BitmapConverter.ToMat((Bitmap)img);
218
+ Mat dst_img = src_img;
219
+
220
+ // 四角形の変換前と変換後の対応する頂点をそれぞれセットする
221
+ Point2f[] src_pt = new Point2f[4];
222
+ src_pt[0] = new Point2f(px1.X, px1.Y);
223
+ src_pt[1] = new Point2f(px2.X, px2.Y);
224
+ src_pt[2] = new Point2f(px3.X, px3.Y);
225
+ src_pt[3] = new Point2f(px4.X, px4.Y);
226
+
227
+ Point2f[] dst_pt = new Point2f[4];
228
+ dst_pt[0] = new Point2f(0, 0);
229
+ dst_pt[1] = new Point2f(399, 0);
230
+ dst_pt[2] = new Point2f(399, 299);
231
+ dst_pt[3] = new Point2f(0, 299);
232
+
233
+ Mat map_matrix = Cv2.GetPerspectiveTransform(src_pt, dst_pt);
234
+
235
+ // 指定された透視投影変換行列により,cvWarpPerspectiveを用いて画像を変換させる
236
+ OpenCvSharp.Size mysize = new OpenCvSharp.Size(400, 300);
237
+ InterpolationFlags OIFLiner = InterpolationFlags.Linear;
238
+ BorderTypes OBTDefault = BorderTypes.Default;
239
+ Cv2.WarpPerspective(src_img, dst_img, map_matrix, mysize, OIFLiner, OBTDefault);
240
+
241
+ // 結果を表示する
242
+ PictureBox p3 = new PictureBox();
243
+ p3.Image = dst_img.ToBitmap();
244
+ p3.Location = new System.Drawing.Point(450, 360);
245
+ p3.Size = new System.Drawing.Size(400, 300);
246
+ this.Controls.Add(p3);
247
+ }
248
+ }
249
+ }
250
+ ```
251
+
252
+ これにより、正常に射影変換ができました。
253
+ ![画像の一部を拡大](c551f21408334439da4b842b54358fa3.png)
254
+
255
+ ありがとうございました。