double[] pts = { 0.0, 0.0, w, 0.0, w, h, 0.0, h }; JavaCV.getPerspectiveTransform(pts, roiPts, tempH); composeParameters[0].compose(parameters.getSurfaceParameters().getH(), false, tempH, false); composeWarper.transform(dstPts.put(imageMouseX, imageMouseY), dstPts, composeParameters[0], true); objectMouseX = (int)Math.round(dstPts.get(0));
public void transformColor(IplImage srcImage, IplImage dstImage, CvRect roi, int pyramidLevel, ImageTransformer.Parameters parameters, boolean inverse) { Parameters p = ((Parameters)parameters); if ((Arrays.equals(p.getColorParameters(), p.getIdentityColorParameters()) && (X == null || p.fakeIdentity)) || (X == null && numGains == 0 && numBiases == 0)) { if (srcImage != dstImage) { cvCopy(srcImage, dstImage); } return; } CvMat X2 = X24x4.get(); prepareColorTransform(X2, pyramidLevel, p, inverse); X2.rows(3); // do color transformation if (roi == null) { cvResetImageROI(dstImage); } else { cvSetImageROI(dstImage, roi); } X2.put(0, 3, X2.get(0, 3)*dstImage.highValue()); X2.put(1, 3, X2.get(1, 3)*dstImage.highValue()); X2.put(2, 3, X2.get(2, 3)*dstImage.highValue()); cvTransform(srcImage, dstImage, X2, null); X2.rows(4); }
protected void prepareTransforms(CvMat H1, CvMat H2, CvMat X, int pyramidLevel, Parameters p) { ProjectiveColorTransformer.Parameters cameraParameters = p.getSurfaceParameters(); ProjectiveColorTransformer.Parameters projectorParameters = p.getProjectorParameters(); if (surfaceTransformer != null) { cvInvert(cameraParameters.getH(), H1); } cvInvert(projectorParameters.getH(), H2); // adjust the scale of the transformation based on the pyramid level if (pyramidLevel > 0) { int scale = 1<<pyramidLevel; if (surfaceTransformer != null) { H1.put(2, H1.get(2)/scale); H1.put(5, H1.get(5)/scale); H1.put(6, H1.get(6)*scale); H1.put(7, H1.get(7)*scale); } H2.put(2, H2.get(2)/scale); H2.put(5, H2.get(5)/scale); H2.put(6, H2.get(6)*scale); H2.put(7, H2.get(7)*scale); } double[] x = projector.colorMixingMatrix.get(); double[] a = projectorParameters.getColorParameters(); double a2 = a[0]; X.put(a2*x[0], a2*x[1], a2*x[2], a[1], a2*x[3], a2*x[4], a2*x[5], a[2], a2*x[6], a2*x[7], a2*x[8], a[3], 0, 0, 0, 1); }
protected void prepareColorTransform(CvMat X2, int pyramidLevel, Parameters p, boolean inverse) { CvMat A = p.getA(), b = p.getB(); cvSetIdentity(X2); X2.rows(3); X2.cols(3); if (p.fakeIdentity && !inverse) { X2.put(A); } else if (A != null && X != null) { cvMatMul(X, A, X2); } else if (X == null) { X2.put(A); } else if (A == null) { X2.put(X); } X2.rows(4); X2.cols(4); if (b != null) { X2.put(0, 3, b.get(0)); X2.put(1, 3, b.get(1)); X2.put(2, 3, b.get(2)); } if (inverse) { // CV_LU doesn't work on OpenCV 2.0 with rows > 3 ... cvInvert(X2, X2, CV_SVD); } }
public CvMat getN0() { n = getN(); if (surfaceTransformer == null) { return n; } // remove projective effect of the current n, // leaving only the effect of n0 camera.getFrontoParallelH(surfaceParameters.get(), n, R); cvInvert(surfaceParameters.getH(), H); cvMatMul(H, surfaceTransformer.getK2(), H); cvMatMul(H, R, H); cvMatMul(surfaceTransformer.getInvK1(), H, H); JavaCV.HtoRt(H, R, t); // compute n0, as a rotation from the z-axis cvGEMM(R, t, 1, null, 0, t, CV_GEMM_A_T); double scale = 1/t.get(2); n.put(0.0, 0.0, 1.0); cvGEMM(R, n, scale, null, 0, n, 0); return n; }
public CvMat getN() { double[] src = projectorTransformer.getReferencePoints2(); double[] dst = projectorTransformer.getReferencePoints1().clone(); dst[0] = projectorParameters.get(0); dst[2] = projectorParameters.get(1); dst[4] = projectorParameters.get(2); // get plane parameters n, but since we model the target to be // the camera, we have to inverse everything before calling // getPlaneParameters() and reframe the n it returns cvTranspose(projectorTransformer.getR(), R); cvGEMM(R, projectorTransformer.getT(), -1, null, 0, t, 0); JavaCV.getPlaneParameters(src, dst, projectorTransformer.getInvK2(), projectorTransformer.getK1(), R, t, n); double d = 1 + cvDotProduct(n, projectorTransformer.getT()); cvGEMM(R, n, 1/d, null, 0, n, 0); return n; }
@Override public Parameters createParameters() { return new Parameters(); }
private double[] getSubspaceInternal() { if (frontoParallelH == null) { return null; } cvMatMul(surfaceTransformer.getK1(), frontoParallelH, H); cvMatMul(surfaceParameters .getH(), H, H); cvMatMul(surfaceTransformer.getInvK2(), H, H); JavaCV.HtoRt(H, R, t); Rodrigues(cvarrToMat(R), cvarrToMat(n), null); double[] p = { n.get(0), n.get(1), n.get(2), t.get(0), t.get(1), t.get(2) }; return p; }
@Override public Parameters clone() { Parameters p = new Parameters(); p.set(this); return p; } }
public double getConstraintError() { double error = surfaceTransformer == null ? 0 : surfaceParameters.getConstraintError(); projectorParameters.update(); return error; } public void compose(ImageTransformer.Parameters p1, boolean inverse1,
@Override public void compose(ImageTransformer.Parameters p1, boolean inverse1, ImageTransformer.Parameters p2, boolean inverse2) { super.compose(p1, inverse1, p2, inverse2); composeColor(p1, inverse1, p2, inverse2); } public void composeColor(ImageTransformer.Parameters p1, boolean inverse1,