Я пытаюсь реализовать компьютерное зрение в приложении для Android.
У меня интегрирован opencv, и я пишу для него собственный код C++, который вызывается с использованием JNI. Кажется, все это работает. Моя проблема в том, что при выполнении кода компьютерного зрения следующая строка приводит к сбою приложения без каких-либо ошибок.
Если я использую детектор сфер, вместо просеивания он работает. На моем физическом устройстве происходит сбой на 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
Я пытаюсь реализовать компьютерное зрение в приложении для Android. У меня интегрирован opencv, и я пишу для него собственный код C++, который вызывается с использованием JNI. Кажется, все это работает. Моя проблема в том, что при выполнении кода компьютерного зрения следующая строка приводит к сбою приложения без каких-либо ошибок. [code]detector->detectAndCompute(usr_img,usr_mask,usr_keypoints,usr_descriptors); [/code] Если я использую детектор сфер, вместо просеивания он работает. На моем физическом устройстве происходит сбой на knnMatch. В то время как на эмулированном Pixel 5 все работает корректно. Может быть, это как-то связано с моими версиями opencv и android? Вот полный код компьютерного зрения: [code]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); } [/code] Моя версия opencv — [b]4.5.4[/b] Моя версия Android — [b]9[/b] на физический телефон и [b]11, API 30[/b] на эмулируемом пикселе 5
Я делаю проект, в котором использую OpenCV для управления некоторыми изображениями, и на Android 13 или более ранней версии все в порядке, но я обновил свой S23 до Android 14 (OneUI 6.1), и теперь студия Android вылетает из-за следующая ошибка, это...
У меня есть многопроектное решение .Net Core (версия 8.0), которое использует собственную библиотеку Linux (.so).
Когда я запускаю проект с включенным отладчиком, программа завершает работу с кодом 0 и без каких-либо сообщений при нажатии на строку,...
У меня есть многопроектное решение .Net Core (версия 8.0), которое использует собственную библиотеку Linux (.so).
Когда я запускаю проект с включенным отладчиком, программа завершает работу с кодом 0 и без каких-либо сообщений при нажатии на строку,...
Я разрабатываю приложение для Android с использованием Kivy и Python, которое включает обработку изображений, выбранных пользователем через виджет Chooser из библиотеки androidstorage4kivy. Основная функциональность моего приложения связана с...
Я разрабатываю приложение для Android с использованием Kivy и Python, которое включает обработку изображений, выбранных пользователем через виджет Chooser из библиотеки androidstorage4kivy. Основная функциональность моего приложения связана с...