質問編集履歴
2
質問事項への回答を追記しました。
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版の情報を追記しました。
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
|
+
```
|