androidでPanoramaViewのような画像をステッチしようとしています。そのためにAndroidNDKとOpenCvライブラリを使用しています。画像のステッチには以下のJniのコードを使用しています。
最初の方法:
extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3Native_FindFeatures(
JNIEnv*, jobject, jlong im1, jlong im2, jlong im3, jint no_images) {
vector<Mat> imgs;
bool try_use_gpu = false;
Mat& temp1 = *((Mat*) im1);
Mat& temp2 = *((Mat*) im2);
Mat& pano = *((Mat*) im3);
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Before stitching Images\n...");
if(temp1.empty() || temp2.empty())
{
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Can’t read one of the images\n...");
printf("Can’t read one of the images\n");
}
else{
imgs.push_back(temp1);
imgs.push_back(temp2);
Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
Stitcher::Status status = stitcher.stitch(imgs, pano);
if (status != Stitcher::OK)
{
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Can't stitch images, error code = %i" +status);
}
else
{
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Stitching Image Successfully");
}
上記のコードは一部の画像では正常に機能していますが、カメラを使用して画像を撮影し、上記のコードを使用してその画像をステッチしようとすると、機能しません.Androidからネイティブコードを呼び出すために以下のコードを使用しています
FindFeatures(Highgui.imread(path + "Pano1.jpg").getNativeObjAddr(), Highgui.imread(path+"Pano2.jpg").getNativeObjAddr(),panorama.getNativeObjAddr(), 2);
Highgui.imwrite(StitchImageDir.getPath()+ File.separator + "panoStich"+dateFormat.format(dateNow) +mImageExt, panorama);
メソッド宣言
public native void FindFeatures(long image1, long image2, long image3,int count);
2番目の方法:
また、ここでコードを利用できるSurfFeatureDetectorを使用して画像をステッチしようとしました。このコードでは、 `cv :: SURF :: SURF(double、int、int、bool、bool)'への未定義の参照のコンパイルエラーが発生しました。必要なすべてのライブラリをヘッダーとNDKのビルドパスに含めました。問題が何であるか理解できませんか?
上記の2つの画像スティッチングの方法、またはその他の新しいアイデアや画像スティッチングの方法について、ご意見がございましたら、お気軽にお問い合わせください。よろしくお願いいたします。