質問編集履歴

2

質問事項への回答を追記しました。

2017/05/24 08:15

投稿

Kapustin
Kapustin

スコア1186

test CHANGED
File without changes
test CHANGED
@@ -329,3 +329,37 @@
329
329
  0.0006888663351174518, 0.0002752964241302562, 1]
330
330
 
331
331
  ```
332
+
333
+
334
+
335
+ ###追記2
336
+
337
+ warperに設定している変換前座標と変換後座標です。これで得られる行列は先述と同値です。
338
+
339
+ ```
340
+
341
+ // SourceRectの設定値:画面のフルスクリーンサイズを設定しています。
342
+
343
+ // setSourceRect(ofRectangle(0, 0, ofGetScreenWidth(), ofGetScreenHeight()));
344
+
345
+
346
+
347
+ srcPoint[0] : 0, 0, 0
348
+
349
+ srcPoint[1] : 1440, 0, 0
350
+
351
+ srcPoint[2] : 1440, 900, 0
352
+
353
+ srcPoint[3] : 0, 900, 0
354
+
355
+
356
+
357
+ dstPoint[0] : 149, 105, 0
358
+
359
+ dstPoint[1] : 610, 170, 0
360
+
361
+ dstPoint[2] : 598, 511, 0
362
+
363
+ dstPoint[3] : 219, 730, 0
364
+
365
+ ```

1

OpenCv版の情報を追記しました。

2017/05/24 08:15

投稿

Kapustin
Kapustin

スコア1186

test CHANGED
File without changes
test CHANGED
@@ -241,3 +241,91 @@
241
241
  ```
242
242
 
243
243
  ![イメージ説明](285e9ceffa24474ef6218e57108e9723.jpeg)
244
+
245
+
246
+
247
+
248
+
249
+ ###追記
250
+
251
+ OpenCv版の座標変換は、下記のような処理を行っています。
252
+
253
+ この行列を4x4に変換したものが、最初のサンプルの行列になっています。
254
+
255
+ 正確に言うと(すこしややこしいですが)`openframeworks` の `ofxQuadWarp`というアドオンを利用し、`getMatrix()`にて得られる変換行列(4x4)を利用しています。
256
+
257
+ こちらは内部的には(精度の問題で)`cvFindHomography`を利用しているようですが、転置行列になるだけで結果はほぼ変わりません。
258
+
259
+
260
+
261
+ ```
262
+
263
+ // openframework上で動かしています。
264
+
265
+
266
+
267
+ ofImage image;
268
+
269
+ image.load("in.jpg");
270
+
271
+
272
+
273
+ cv::Mat cvInImage = cv::Mat(image.getHeight(), image.getWidth(), CV_8UC3, image.getPixels().getData());
274
+
275
+ cv::Mat cvOutImage = cvInImage.clone();
276
+
277
+
278
+
279
+ vector<cv::Point2f> src;
280
+
281
+ vector<cv::Point2f> dst;
282
+
283
+
284
+
285
+ for(int i = 0; i < 4; i ++){
286
+
287
+ // 変換前の座標配列:入力画像の左上、右上、右下、左下の座標
288
+
289
+ src.push_back(cv::Point2f(warper.srcPoints[i].x, warper.srcPoints[i].y));
290
+
291
+ // 変換後の座標配列:最初の画像の左(OpenCvの表記)の白い四角の四隅にある黄色い点の座標(左上、右上、右下、左下の順)
292
+
293
+ dst.push_back(cv::Point2f(warper.dstPoints[i].x, warper.dstPoints[i].y));
294
+
295
+ }
296
+
297
+
298
+
299
+ cv::Mat warp_matrix = cv::getPerspectiveTransform(src, dst);
300
+
301
+ cv::warpPerspective(cvInImage, cvOutImage, warp_matrix, cvInImage.size());
302
+
303
+
304
+
305
+
306
+
307
+ ofImage outImage;
308
+
309
+ outImage.allocate(image.getHeight(), image.getWidth(), image.getImageType());
310
+
311
+ outImage.setFromPixels(cvOutImage.ptr(), cvOutImage.cols, cvOutImage.rows, image.getImageType(), false);
312
+
313
+ outImage.save("out.jpg");
314
+
315
+
316
+
317
+ cout << warp_matrix << endl;
318
+
319
+ ```
320
+
321
+ ```
322
+
323
+ // OpenCv版の変換行列の出力結果
324
+
325
+ [0.7403473533105349, 0.1380676946623043, 148.9999999999996;
326
+
327
+ 0.1622461658588558, 0.895410834059531, 104.9999999999999;
328
+
329
+ 0.0006888663351174518, 0.0002752964241302562, 1]
330
+
331
+ ```