質問編集履歴
1
解決方法を追記した
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
|
+

|
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
|
+

|
254
|
+
|
255
|
+
ありがとうございました。
|