2016-11-28 3 views
0

Utilisation de liaisons JavaCPP pour OpenCV 3.1, code écrit en Scala. Les méthodes sont mappées presque exactement comme OpenCV 3.1 en C++. J'essaye de créer une matrice de transformation affine pour que je puisse déformer une image en utilisant des repères. Je sens que je suis mise pas correctement les valeurs du tapis, mais comment pourrais-je faireComment créer un OpenCV Mat de forme [3,2] pour une transformation affine?

java.lang.RuntimeException: /Users/saudet/projects/bytedeco/javacpp-presets/opencv/cppbuild/macosx-x86_64/opencv-3.1.0/modules/imgproc/src/imgwarp.cpp:6360: 
error: (-215) src.checkVector(2, CV_32F) == 3 && dst.checkVector(2, CV_32F) == 3 in function getAffineTransform 

    at org.bytedeco.javacpp.opencv_imgproc.getAffineTransform(flandmarkTest.sc0.tmp) 
    at #worksheet#.H$lzycompute(flandmarkTest.sc0.tmp:82) 
    at #worksheet#.H(flandmarkTest.sc0.tmp:82) 
    at #worksheet#.get$$instance$$H(flandmarkTest.sc0.tmp:82) 
    at #worksheet#.#worksheet#(flandmarkTest.sc0.tmp:236) 

Voici mon code, que: Cependant, la méthode échoue getAffineTransform avec l'erreur suivante?

val landmarkM = new Mat() 
landmarkM.put(new Scalar(outerEyeLeft(0),outerEyeLeft(1))) 
landmarkM.put(new Scalar(outerEyeRight(0),outerEyeRight(1))) 
landmarkM.put(new Scalar(nose(0),nose(1))) 
val imgDim = img_grayscale.width() 
val refM = new Mat() 
refM.put(new Scalar(template(1)(0)*imgDim,template(1)(1)*imgDim)) 
refM.put(new Scalar(template(4)(0)*imgDim,template(4)(1)*imgDim)) 
refM.put(new Scalar(template(5)(0)*imgDim,template(5)(1)*imgDim)) 
refM.checkVector(2) // returns -1 
landmarkM.checkVector(2) // returns -1 
val H: Mat = getAffineTransform(landmarkM, refM) 

Répondre

0

En utilisant le constructeur suivant a résolu mon problème:

new Mat(3,2,CV_32F)

Edit: je devais aller un peu plus loin et utiliser un indexeur:

val landmarkM = new Mat(3,2,CV_32F) 
val ldIdx: FloatRawIndexer = landmarkM.createIndexer() 
ldIdx.put(0L,0L,Math.round(outerEyeLeft(0)).toInt) 
ldIdx.put(0L,1L,Math.round(outerEyeLeft(1)).toInt) 
ldIdx.put(1L,0L,Math.round(outerEyeRight(0)).toInt) 
ldIdx.put(1L,1L,Math.round(outerEyeRight(1)).toInt) 
ldIdx.put(2L,0L,Math.round(nose(0)).toInt) 
ldIdx.put(2L,1L,Math.round(nose(1)).toInt) 
ldIdx.release()