Функция imwrite opencv всегда возвращает false, когда я хочу сохранить кадр в SDCard JNI C ++ - PullRequest
0 голосов
/ 25 апреля 2019

Я использую OpenCV в Android Unsing JNI C ++, и я хочу, чтобы обнаружить изображение и сохранить обнаруженное лицо в SDCard Android с помощью функции, предоставляемой OpenCV в C ++ imwrite (), но когда я компилирую все, но это происходит, но когда я извиняюсь, приложение imwrite не делаетне работает, он возвращает ложь, даже если я использую разрешение в файле манифеста (WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE).Прошу прощения за любые ошибки в английском, потому что это не мой язык оригинала.помогите пожалуйста и проголосуйте пожалуйста, потому что этот проект очень важен для меня

это код:

String human_cascade_name = "/storage/extSdCard/OpenCV/haarcascade_fullbody.xml";
CascadeClassifier human_cascade;

//-- 1. Load the cascades
      if( !human_cascade.load( human_cascade_name ) ){
      printf("--(!)Error loading\n");
       return;
        }
std::vector<Rect> humans;
     Mat frame_gray;

     cvtColor( frame, frame_gray, CV_BGR2GRAY );
     equalizeHist( frame_gray, frame_gray );

     //-- Detect faces
     human_cascade.detectMultiScale( frame_gray, humans, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
     stringstream ss;
     static int count=0;


     for(int i=0;i<humans.size();i++){


     //__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "hhhhhhhhhhhhhhhh : %d ",humans[i].y);

     Point center( humans[i].x + humans[i].width*0.5, humans[i].y + humans[i].height*0.5 );
     ellipse( frame, center, Size( 2, 2), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );

     rectangle(frame,Point(humans[i].x,humans[i].y),Point(humans[i].x+humans[i].width,humans[i].y+humans[i].height), Scalar(0,255,0));

       }
       count+=1;
       ss << count;
       vector<int> compression_params;
       compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
       compression_params.push_back(9);
       if(imwrite("/storage/extSdCard/OpenCV/User1.jpg", frame)){
       __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "yes");

       }else{
       __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "no");

       };


      }

1 Ответ

0 голосов
/ 25 апреля 2019

Вы видите путь к SDCard в виде /storage/extSdCard в adb оболочке или в вашей программе передачи файлов на ПК, но ваше приложение Android не имеет доступа по этому пути. Он должен использовать getExternalStorageDirectory() API, как показано здесь .

...