mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.1 KiB
113 lines
4.1 KiB
#!/usr/bin/env python |
|
|
|
# Python 2/3 compatibility |
|
from __future__ import print_function |
|
|
|
import os, numpy |
|
import math |
|
import unittest |
|
import cv2 as cv |
|
|
|
from tests_common import NewOpenCVTests |
|
|
|
def lookAtMatrixCal(position, lookat, upVector): |
|
tmp = position - lookat |
|
norm = numpy.linalg.norm(tmp) |
|
w = tmp / norm |
|
tmp = numpy.cross(upVector, w) |
|
norm = numpy.linalg.norm(tmp) |
|
u = tmp / norm |
|
v = numpy.cross(w, u) |
|
res = numpy.array([ |
|
[u[0], u[1], u[2], 0], |
|
[v[0], v[1], v[2], 0], |
|
[w[0], w[1], w[2], 0], |
|
[0, 0, 0, 1.0] |
|
], dtype=numpy.float32) |
|
translate = numpy.array([ |
|
[1.0, 0, 0, -position[0]], |
|
[0, 1.0, 0, -position[1]], |
|
[0, 0, 1.0, -position[2]], |
|
[0, 0, 0, 1.0] |
|
], dtype=numpy.float32) |
|
res = numpy.matmul(res, translate) |
|
return res |
|
|
|
class raster_test(NewOpenCVTests): |
|
|
|
def prepareData(self): |
|
self.vertices = numpy.array([ |
|
[ 2.0, 0.0, -2.0], |
|
[ 0.0, -6.0, -2.0], |
|
[-2.0, 0.0, -2.0], |
|
[ 3.5, -1.0, -5.0], |
|
[ 2.5, -2.5, -5.0], |
|
[-1.0, 1.0, -5.0], |
|
[-6.5, -1.0, -3.0], |
|
[-2.5, -2.0, -3.0], |
|
[ 1.0, 1.0, -5.0], |
|
], dtype=numpy.float32) |
|
|
|
self.indices = numpy.array([ [0, 1, 2], [3, 4, 5], [6, 7, 8]], dtype=int) |
|
|
|
col1 = [ 185.0, 238.0, 217.0 ] |
|
col2 = [ 238.0, 217.0, 185.0 ] |
|
col3 = [ 238.0, 10.0, 150.0 ] |
|
|
|
self.colors = numpy.array([ |
|
col1, col2, col3, |
|
col2, col3, col1, |
|
col3, col1, col2, |
|
], dtype=numpy.float32) |
|
|
|
self.colors = self.colors / 255.0 |
|
|
|
self.zNear = 0.1 |
|
self.zFar = 50.0 |
|
self.fovy = 45.0 * math.pi / 180.0 |
|
|
|
position = numpy.array([0.0, 0.0, 5.0], dtype=numpy.float32) |
|
lookat = numpy.array([0.0, 0.0, 0.0], dtype=numpy.float32) |
|
upVector = numpy.array([0.0, 1.0, 0.0], dtype=numpy.float32) |
|
self.cameraPose = lookAtMatrixCal(position, lookat, upVector) |
|
|
|
self.depth_buf = numpy.ones((240, 320), dtype=numpy.float32) * self.zFar |
|
self.color_buf = numpy.zeros((240, 320, 3), dtype=numpy.float32) |
|
|
|
self.settings = cv.TriangleRasterizeSettings().setShadingType(cv.RASTERIZE_SHADING_SHADED) |
|
self.settings = self.settings.setCullingMode(cv.RASTERIZE_CULLING_NONE) |
|
|
|
def compareResults(self, needRgb, needDepth): |
|
if needDepth: |
|
depth = self.get_sample('rendering/depth_image_Clipping_320x240_CullNone.png', cv.IMREAD_ANYDEPTH).astype(numpy.float32) |
|
depthFactor = 1000.0 |
|
diff = depth/depthFactor - self.depth_buf |
|
norm = numpy.linalg.norm(diff) |
|
self.assertLessEqual(norm, 356.0) |
|
|
|
if needRgb: |
|
rgb = self.get_sample('rendering/example_image_Clipping_320x240_CullNone_Shaded.png', cv.IMREAD_ANYCOLOR) |
|
diff = rgb/255.0 - self.color_buf |
|
norm = numpy.linalg.norm(diff) |
|
self.assertLessEqual(norm, 11.62) |
|
|
|
def test_rasterizeBoth(self): |
|
self.prepareData() |
|
self.color_buf, self.depth_buf = cv.triangleRasterize(self.vertices, self.indices, self.colors, self.color_buf, self.depth_buf, |
|
self.cameraPose, self.fovy, self.zNear, self.zFar, self.settings) |
|
self.compareResults(needRgb=True, needDepth=True) |
|
|
|
def test_rasterizeDepth(self): |
|
self.prepareData() |
|
self.depth_buf = cv.triangleRasterizeDepth(self.vertices, self.indices, self.depth_buf, |
|
self.cameraPose, self.fovy, self.zNear, self.zFar, self.settings) |
|
self.compareResults(needRgb=False, needDepth=True) |
|
|
|
def test_rasterizeColor(self): |
|
self.prepareData() |
|
self.color_buf = cv.triangleRasterizeColor(self.vertices, self.indices, self.colors, self.color_buf, |
|
self.cameraPose, self.fovy, self.zNear, self.zFar, self.settings) |
|
self.compareResults(needRgb=True, needDepth=False) |
|
|
|
if __name__ == '__main__': |
|
NewOpenCVTests.bootstrap()
|
|
|