当我想在 SD 卡 JNI C++ 中保存帧时,imwrite opencv 函数总是返回 false

Posted

技术标签:

【中文标题】当我想在 SD 卡 JNI C++ 中保存帧时,imwrite opencv 函数总是返回 false【英文标题】:imwrite opencv function always return false when i want to save frame in sdcard JNI C++ 【发布时间】:2019-04-25 02:39:10 【问题描述】:

我在 android unsing JNI c++ 中使用 opencv,我想使用 c++ imwrite() 中 opencv 提供的函数检测图像并将检测到的面部保存在 android sdcard 中,但是当我编译所有东西时成功但是当我执行应用程序时 imwrite 没有即使我在清单文件(WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE)中使用权限,它也会返回 false。 对于英语中的任何错误,我深表歉意,因为它不是我的原始语言。 请帮助并请投票,因为这个项目对我来说非常重要

这是代码:

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");

       ;


      

【问题讨论】:

这似乎与 JNI 没有任何关系。我建议您首先将其作为一个直接的 C++ 应用程序进行调试;它可能会简化事情。 可能重复:***.com/questions/22369168 另一个可能的重复项(尽管您似乎已经检查过了):***.com/questions/15291504 【参考方案1】:

您在 adb shell 或 PC 上的文件传输程序中看到 sdcard 的路径为 /storage/extSdCard,但您的 Android 应用无法通过此路径访问。它应该使用getExternalStorageDirectory() API,如here 所示。

【讨论】:

以上是关于当我想在 SD 卡 JNI C++ 中保存帧时,imwrite opencv 函数总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fresco 时如何将图像保存到 SD 卡?

将叠加图像保存到 SD 卡

如何在存储 SD 卡之前裁剪捕获的图像? [复制]

Android 将位图保存到 SD 卡

从android寻呼机将图像保存到sd卡

将文本文件保存到 sd 卡