新手用opencv做影像拼接,總是回傳ERR_NEED_MORE_IMGS錯誤。
呼叫代碼簡單如下:
cv::Ptr<cv::Stitcher> stitcher = cv::Stitcher::create(cv::Stitcher::Mode::PANORAMA);
cv::Stitcher::Status status = stitcher->stitch(vImg, rImg);
if (cv::Stitcher::OK == status)
cv::imshow("Stitching Result", rImg);
else
printf("Stitching fail.");
opencv版本是4.1.1
拼接測驗用圖:

uj5u.com熱心網友回復:
這里都沒什么人嗎?uj5u.com熱心網友回復:
找到原因了,更換一下圖片順序,android似乎要按一定順序才行,iOS的就不需要,可能是android的opencv stitching比較底層,stitching分高度抽象版和細節版,細節版可以設定更多引數,有更高的自由度。Android版,我的代碼如下:extern "C"
JNIEXPORT jobject JNICALL
Java_com_zy_fullimagemerge_ImageMergeTool_nativeStitchImages(JNIEnv *env, jclass clazz,
jobjectArray bitmaps) {
int count = env->GetArrayLength(bitmaps);
std::vector<Mat> imgs;
for (int i = 0; i < count; i++) {
jobject bitmap = env->GetObjectArrayElement(bitmaps, i);
int width = 0;
int height = 0;
int depth = 0;
unsigned char* pixels = getPixelsFromBitmap(env, bitmap, &width, &height, &depth);
int type = depth==4? CV_8UC4 : depth==3? CV_8UC3 : depth==1? CV_8UC1 : CV_8UC4;
Mat mat = Mat(height, width, type, pixels);
Mat gray;
if (type == CV_8UC4) {
cvtColor(mat, gray, COLOR_RGBA2RGB);
imgs.push_back(gray);
//imgs.push_back(mat);
} else if (type == CV_8UC3) {
imgs.push_back(mat);
} else {
cvtColor(mat,gray,COLOR_GRAY2RGB);
imgs.push_back(gray);
}
free(pixels);
}
Mat result;
Ptr<Stitcher> stitcher = Stitcher::create();
//這部分可以注釋掉
Ptr<detail::BestOf2NearestMatcher> matcher = detail::BestOf2NearestMatcher::create();
stitcher->setFeaturesMatcher(matcher);
stitcher->setBundleAdjuster(new detail::BundleAdjusterRay);
stitcher->setSeamFinder(detail::NoSeamFinder::createDefault(detail::SeamFinder::NO));
stitcher->setExposureCompensator(detail::NoExposureCompensator::createDefault(detail::NoExposureCompensator::NO));
stitcher->setBlender(new detail::FeatherBlender());
Stitcher::Status status = stitcher->stitch(imgs, result);
int type = result.type();
int depth = type == CV_8UC4? 4 : type == CV_8UC3? 3 : type == CV_8UC1? 1 : 4;
jobject bitmap = createJavaBitmapWithPixels(env, result.data, result.cols, result.rows, depth);
return bitmap;
}
圖片要有重合部分,如果失敗,更換一下圖片順序
uj5u.com熱心網友回復:
你用的是我上面兩個圖片做拼接嗎?Opencv提供的介面很多圖片是可以拼接的,就上面的圖片拼接出錯了。
另外有C++版本的代碼嗎,這邊是在windows上跑的。
uj5u.com熱心網友回復:
這兩張圖片確實不行,可能太暗了,不是彩色的。我是在mac上android studio上跑的,opencv4.1.2。要不你先看看他們之間的特征匹配點數是不是夠多uj5u.com熱心網友回復:
我發現stitcher演算法并不是很魯棒,估計得進里面修改代碼,有些情況得自己處理uj5u.com熱心網友回復:
我從別人哪里知道用opencv是可以做的,而且就是拿的上面的影像。現在不能做自動拼接,就找方法做手動拼接了。
不過用addWeighted方法實作拼接效果不太理想。接縫太明顯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/16547.html
標籤:OpenCV
上一篇:AS-修改APP圖示和名字
