我有一個圖像的高度圖,它告訴我在Z方向上每個像素的偏移量。我的目標是隻使用它的高度圖平整扭曲的圖像。使用高度圖扭曲圖像?
我該怎麼做呢?如果有幫助,我知道相機的位置。
要做到這一點,我在想假設每個像素是在一個平面上的點,然後翻譯垂直根據Z值我從高度圖得到的每個點,並從那翻譯(想象你正在看從上面的點;轉變將導致點從您的角度移動)。
從這個預測的轉變中,我可以提取每個像素的X和Y偏移,我可以將它提供給cv.Remap()
。
但是我不知道如何通過OpenCV獲得一個點的投影3D偏移量,更不用說構建一個偏移量圖。
這裏是我的參考圖像的我在做什麼:
我知道激光器(45度)的角度,以及從校正圖像,我可以真的很容易計算書的高度:
h(x) = sin(theta) * abs(calibration(x) - actual(x))
我這樣做的兩條線和線性內插兩林使用這種方法生成曲面(Python代碼。這是一個循環內):
height_grid[x][y] = heights_top[x] * (cv.GetSize(image)[1] - y) + heights_bottom[x] * y
我希望這有助於;)
眼下,這就是我要dewarp圖像。中間項目所有的怪東西3D座標到相機平面,因爲它的位置(與相機的位置,旋轉等):這是變成圖像和代碼的龐大線程現在
class Point:
def __init__(self, x = 0, y = 0, z = 0):
self.x = x
self.y = y
self.z = z
mapX = cv.CreateMat(cv.GetSize(image)[1], cv.GetSize(image)[0], cv.CV_32FC1)
mapY = cv.CreateMat(cv.GetSize(image)[1], cv.GetSize(image)[0], cv.CV_32FC1)
c = Point(CAMERA_POSITION[0], CAMERA_POSITION[1], CAMERA_POSITION[2])
theta = Point(CAMERA_ROTATION[0], CAMERA_ROTATION[1], CAMERA_ROTATION[2])
d = Point()
e = Point(0, 0, CAMERA_POSITION[2] + SENSOR_OFFSET)
costx = cos(theta.x)
costy = cos(theta.y)
costz = cos(theta.z)
sintx = sin(theta.x)
sinty = sin(theta.y)
sintz = sin(theta.z)
for x in xrange(cv.GetSize(image)[0]):
for y in xrange(cv.GetSize(image)[1]):
a = Point(x, y, heights_top[x/2] * (cv.GetSize(image)[1] - y) + heights_bottom[x/2] * y)
b = Point()
d.x = costy * (sintz * (a.y - c.y) + costz * (a.x - c.x)) - sinty * (a.z - c.z)
d.y = sintx * (costy * (a.z - c.z) + sinty * (sintz * (a.y - c.y) + costz * (a.x - c.x))) + costx * (costz * (a.y - c.y) - sintz * (a.x - c.x))
d.z = costx * (costy * (a.z - c.z) + sinty * (sintz * (a.y - c.y) + costz * (a.x - c.x))) - sintx * (costz * (a.y - c.y) - sintz * (a.x - c.x))
mapX[y, x] = x + (d.x - e.x) * (e.z/d.z)
mapY[y, x] = y + (d.y - e.y) * (e.z/d.z)
print
print 'Remapping original image using map...'
remapped = cv.CreateImage(cv.GetSize(image), 8, 3)
cv.Remap(image, remapped, mapX, mapY, cv.CV_INTER_LINEAR)
...無論如何,這個代碼塊需要我7分鐘才能在18MP相機圖像上運行;這是方式太長了,最後,這種方法對圖像沒有任何影響(每個像素的偏移量爲<< 1
)。
任何想法?
能OpenCV的地圖3D到2D ?或者我必須爲此提出自己的公式?不過,我會嘗試實施這個,所以謝謝! – Blender