2013-05-07 93 views
2

我有一張圖像,我想從中獲得垂直ROI,應用一些轉換並添加到另一張圖像。OpenCV在新圖像中旋轉,扭曲和翻譯ROI

我在StackOverflow和其他論壇上閱讀了很多問題和答案,但我仍然堅持這個問題。目前我正在使用OpenCV的C接口,但如果需要的話我可以使用C++接口(我必須編寫一個轉換函數,因爲我正在使用Cocoa中的CGImageRef)。

從頂部圖像獲取(見下文),在底部的形象,我想我必須:

  • 獲得第一個圖像上的ROI;
  • 將其縮小;
  • 獲取我的「寬度」角度(角度固定)中心和2個圓圈之間的交點。
  • 扭曲的圖像,使角落堅持我的交點;
  • 圍繞中心點旋轉並將其放入輸出圖像中。

ROI rotate and distort

目前,我管理很好地做到這一點:

  • 獲取投資回報;
  • 使用cvResize縮放它;
  • 獲取交點不應太複雜,因爲它是純幾何圖形,我爲了其他目的而實現它。

但是,我不知道如何扭曲我的投資回報率的結果圖像,我不知道它是否甚至可以在OpenCV中。我需要使用一種視角矯正嗎?

而且,我一直在嘗試通過這裏找到的幾個很好的帖子解決方案來與旋轉的邊框一起旋轉,但目前沒有好的結果。

編輯:

好吧,我設法做的工作的第一部分:

  • 獲取的基礎圖像的ROI;
  • 旋轉並將其放置在離中心一段固定的距離處。

Circle SlitScan

我使用的方法解釋,並在這個職位編碼:https://stackoverflow.com/a/16285286/1060921

我只加一個變量來設置旋轉點,讓我的內圓。

NB:我設置了ROI BEFORE來調用方法,因此post方法中的ROI是...圖像大小。然後我用cvAdd將它放在最終圖像的中心。

在這裏,我得到我的相機輸入的一個像素片。 我現在想要做的是扭曲更大的切片,例如從內圈的2個像素到外圈的5個像素。

回答

0

看到這個tutorial它使用warpPerspective糾正透視失真。

編輯:你的情況warpAffine應該是更好更簡單的解決方案。

所以,你可以做這樣的事情,只是使用四點,而不是三個:

Point2f srcTri[3]; 
Point2f dstTri[3]; 

Mat rot_mat(2, 3, CV_32FC1); 
Mat warp_mat(2, 3, CV_32FC1); 
Mat src, warp_dst, warp_rotate_dst; 

/// Load the image 
src = imread(...); 

/// Set the dst image the same type and size as src 
warp_dst = Mat::zeros(src.rows, src.cols, src.type()); 

/// Set your 3 points to calculate the Affine Transform 
srcTri[0] = Point2f(0,0); 
srcTri[1] = Point2f(src.cols - 1, 0); 
srcTri[2] = Point2f(0, src.rows - 1); 

dstTri[0] = Point2f(src.cols*0.0, src.rows*0.33); 
dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25); 
dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7); 

/// Get the Affine Transform 
warp_mat = getAffineTransform(srcTri, dstTri); 

/// Apply the Affine Transform just found to the src image 
warpAffine(src, warp_dst, warp_mat, warp_dst.size());