Использование привязок JavaCPP для OpenCV 3.1, код написан на Scala. Методы отображаются почти так же, как OpenCV 3.1 в C ++. Я пытаюсь создать матрицу аффинного преобразования, чтобы я мог деформировать изображение, используя ориентиры. Тем не менее getAffineTransform
метод завершается со следующей ошибкой:
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)
Вот мой код, у меня такое ощущение, что я неправильно устанавливаю значения мата, но как мне это сделать?
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)
Использование следующего конструктора решило мою проблему:
new Mat(3,2,CV_32F)
Изменить: мне пришлось пойти немного дальше и использовать индексатор:
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()
Других решений пока нет …