OpenCV SIFT обнаружениеAndCompute аварийно завершает работу без ошибок на AndroidAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 OpenCV SIFT обнаружениеAndCompute аварийно завершает работу без ошибок на Android

Сообщение Anonymous »

Я пытаюсь реализовать компьютерное зрение в приложении для Android.
У меня интегрирован opencv, и я пишу для него собственный код C++, который вызывается с использованием JNI. Кажется, все это работает. Моя проблема в том, что при выполнении кода компьютерного зрения следующая строка приводит к сбою приложения без каких-либо ошибок.

Код: Выделить всё

detector->detectAndCompute(usr_img,usr_mask,usr_keypoints,usr_descriptors);
Если я использую детектор сфер, вместо просеивания он работает. На моем физическом устройстве происходит сбой на knnMatch. В то время как на эмулированном Pixel 5 все работает корректно. Может быть, это как-то связано с моими версиями opencv и android?
Вот полный код компьютерного зрения:

Код: Выделить всё

void process_image(char* in_filepath,char* out_filepath){

Mat usr_img = imread(in_filepath); //read images from the disk
Mat ref_img = imread("redacted");
Mat overlay_img = imread("redacted");
Mat out_img;//make a copy for output
usr_img.copyTo(out_img);

//Set up feature detector
Ptr detector = SIFT::create();
//Ptr detector = ORB::create(); //detectAndCompute works if I use this instead

//Set up feature matcher
Ptr matcher = BFMatcher::create(NORM_HAMMING,true);

//generate mask for ref image (so features are not created from the background)
Mat ref_mask; //defines parts of the ref image that will be searched for features.
inRange(ref_img,Scalar(0.0,0.0,252.0),Scalar(2.0,2.0,255.0),ref_mask);
bitwise_not(ref_mask,ref_mask);//invert the mask

//and an all white mask for the usr image
Mat usr_mask = Mat(usr_img.cols,usr_img.rows, CV_8UC1, Scalar(255.0));

//detect keypoints
std::vector ref_keypoints, usr_keypoints;
Mat ref_descriptors, usr_descriptors;
detector->detectAndCompute(ref_img,ref_mask,ref_keypoints,ref_descriptors);
detector->detectAndCompute(usr_img,usr_mask,usr_keypoints,usr_descriptors);

//match descriptors between images, each match is a vector of matches by decreasing "distance"
std::vector matches;
matcher->knnMatch(usr_descriptors,ref_descriptors,matches,2);

//throw out bad matches
std::vector good_matches;
for(uint32_t i = 0; i < matches.size(); i++){
//consider it a good match if the next best match is 33% worse
if(matches[i][0].distance*1.33 < matches[i][1].distance){
good_matches.push_back(matches[i][0]);
}
}

//visualize the matches for debugging purposes
Mat draw_match_img;
drawMatches(usr_img,usr_keypoints,ref_img,ref_keypoints,good_matches,draw_match_img);
imwrite("redacted",draw_match_img);
}
Моя версия opencv — 4.5.4
Моя версия Android — 9 на физический телефон и 11, API 30 на эмулируемом пикселе 5

Подробнее здесь: https://stackoverflow.com/questions/702 ... on-android
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»