2017-06-06 16 views
0

OpenCVを使用して2つの画像を整列しようとしています。私が見つけたC++/Pythonチュートリアルのこのコードは、http://www.learnopencv.com/image-alignment-ecc-in-opencv-c-python/Android:OpenCVを使用して画像を整列する

findTransformECC()のinput_askには特別なパラメータが必要です。 C++とPythonの関数はこれを持っていません。

マイコード:

import android.graphics.Bitmap; 

import org.opencv.android.Utils; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.core.TermCriteria; 
import org.opencv.imgproc.Imgproc; 

import static org.opencv.core.CvType.CV_32F; 
import static org.opencv.video.Video.MOTION_EUCLIDEAN; 
import static org.opencv.video.Video.findTransformECC; 

public class ImageProcessor { 

    public static Bitmap alignImages(Bitmap A, Bitmap B){ 
     final int warp_mode = MOTION_EUCLIDEAN; 
     Mat matA = new Mat(A.getHeight(),A.getWidth(), CvType.CV_8UC3); 
     Mat matAgray = new Mat(A.getHeight(),A.getWidth(), CvType.CV_8U); 
     Mat matB = new Mat(B.getHeight(),B.getWidth(), CvType.CV_8UC3); 
     Mat matBgray = new Mat(B.getHeight(),B.getWidth(), CvType.CV_8U); 
     Mat matBaligned = new Mat(A.getHeight(),A.getWidth(), CvType.CV_8UC3); 
     Mat warpMatrix = Mat.eye(3,3,CV_32F); 

     Utils.bitmapToMat(A,matA); 
     Utils.bitmapToMat(B,matB); 


     Imgproc.cvtColor(matA,matAgray, Imgproc.COLOR_BGR2GRAY); 
     Imgproc.cvtColor(matB,matBgray,Imgproc.COLOR_BGR2GRAY); 

     int numIter = 5000; 
     double terminationEps = 1e-10; 
     TermCriteria criteria = new TermCriteria(TermCriteria.COUNT+TermCriteria.EPS,numIter,terminationEps); 

     findTransformECC(matAgray,matBgray,warpMatrix,warp_mode,criteria,matBgray); 
     Imgproc.warpPerspective(matA,matBaligned,warpMatrix,matA.size(),Imgproc.INTER_LINEAR+ Imgproc.WARP_INVERSE_MAP); 
     Bitmap alignedBMP = Bitmap.createBitmap(A.getWidth(),A.getHeight(),null); 
     Utils.matToBitmap(matBaligned,alignedBMP); 
     return alignedBMP; 
    } 

} 

私はあなたがfindTransformECCにフル3x3ホモグラフィ行列warpMatrixを入力しているが、あなたの選択warp_modeMOTION_EUCLIDEANで次のエラー

W/System.err: CvException [org.opencv.core.CvException: cv::Exception: /build/master_pack-android/opencv/modules/imgproc/src/imgwarp.cpp:5987: error: (-215) (M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3 in function void cv::warpAffine(cv::InputArray, cv::OutputArray, cv::InputArray, cv::Size, int, int, const Scalar&) 
W/System.err: ] 
W/System.err:  at org.opencv.video.Video.findTransformECC_0(Native Method) 
W/System.err:  at org.opencv.video.Video.findTransformECC(Video.java:132) 
W/System.err:  at com.test.imgptest.ImageProcessor.alignImages(ImageProcessor.java:42) 
W/System.err:  at com.test.imgptest.MainActivity.onActivityResult(MainActivity.java:141) 
W/System.err:  at android.app.Activity.dispatchActivityResult(Activity.java:6937) 
W/System.err:  at android.app.ActivityThread.deliverResults(ActivityThread.java:4122) 
W/System.err:  at android.app.ActivityThread.handleSendResult(ActivityThread.java:4169) 
W/System.err:  at android.app.ActivityThread.-wrap20(ActivityThread.java) 
W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1552) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6186) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

答えて

1

を取得します。

3x3ホモグラフィを使用する場合は、warp_modeMOTION_HOMOGRAPHYに設定する必要があります。

ユークリッド変換が必要な場合は、ユークリッド変換が2x3行列で与えられるので、入力warpMatrixの最後の行をクリップするだけです。 findTransformECC() documentationによれば、

MOTION_EUCLIDEANは、運動モデルとしてユークリッド(剛性)変換を設定する。 3つのパラメータが推定される。 warpMatrixは2x3です。あなたは2x3ワープ行列で作業することがありますので、

次に、画像を整列させるwarpAffine()の代わりwarpPerspective()を使用しています。

+0

ありがとうございます!私は 'MOTION_HOMOGRAPHY'を保つことを意味しました。今、愚かな気分になる。 :P – xSooDx

+1

@xSooDxそれは私たちの最高に起こります!他の人のために、その可能性も含めて私の答えを少し編集しました。 –

関連する問題