在Android Studio中使用NDK GrabCut返回的OpenCV总是黑色面具
OpenCV in Android Studio with NDK grabCut returns always black mask
我使用此示例中的步骤创建了一个具有NDK支持和OPENCV本机库的Android Studio项目:
https://github.com/leadrien/opencv_native_androidstudio
在此示例正常工作的情况下,我正在尝试使用GrabCut算法。我的应用程序应在主要活动中显示3个图像:原始图像,转换的图像和使用的掩码。但是实际上显示的面具是全黑的,因此,处理的图像就像原始图像一样。
我的Java代码:
private void processImage(){
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pastis);
Bitmap bmp32 = srcBitmap.copy(Bitmap.Config.ARGB_8888, true);
Mat imgToProcess = new Mat();
Mat mask = new Mat();
//utils from opencv library
Utils.bitmapToMat(bmp32, imgToProcess);
//NDK function
salt(imgToProcess.getNativeObjAddr(), mask.getNativeObjAddr(), 2000);
Bitmap bmp = Bitmap.createBitmap(imgToProcess.cols(), imgToProcess.rows(), Bitmap.Config.ARGB_8888);
//utils from opencv library
Utils.matToBitmap(imgToProcess, bmp);
Bitmap bmpMask = Bitmap.createBitmap(mask.cols(), mask.rows(), Bitmap.Config.ARGB_8888);
//utils from opencv library
Utils.matToBitmap(mask, bmpMask);
ImageView imageContainer = (ImageView) findViewById(R.id.resultImage);
imageContainer.setImageBitmap(bmp);
ImageView maskContainer = (ImageView) findViewById(R.id.maskImage);
maskContainer.setImageBitmap(bmpMask);
}
我的NDK代码是:
void JNICALL Java_com_ach_MainActivity_salt(JNIEnv *env, jobject instance, jlong matAddrGray, jlong mask, jint nbrElem) {
Mat &mGr = *(Mat *) matAddrGray;
Mat &maskR = *(Mat *) mask;
int r = mGr.rows;
int c = mGr.cols;
Mat bgdModel, fgdModel;
Rect rect = Rect(10, 10,c-10, r-10);
cvtColor(mGr , mGr , CV_RGBA2RGB);
maskR.create(mGr.size(), CV_8UC1);
grabCut(mGr, maskR, rect, bgdModel, fgdModel, 2, GC_INIT_WITH_RECT);
mGr.copyTo(mGr, maskR);
}
¿为什么我总是得到全黑面具?
此外,在我的手机(三星Galaxy S5)中执行大约50秒钟的图像分辨率为256 x 192,只有2个步骤。这是正常的吗?预先感谢:)
我很久以前发现了这个问题,但我忘了发布答案。
OPENCV NDK中的某些错误似乎存在问题,我解决了我的问题在 copyto 函数中使用源和目标的相同位图:
mGr.copyTo(mGr, maskR); --> PROBLEMS
mGr.copyTo(mGrDest, maskR); --> WORKING
,并且,以防万一,由于这个问题,我避免使用源源可测点图的其他功能,例如 cvtcolor ,但我认为该功能没有问题。
>我希望我的解决方案可以与您的代码一起使用!:)
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OpenCV C++.快速计算混淆矩阵
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 哪些库可以通过Opencv调整曝光率
- 安装opencv失败-粘贴CMakeError.log的内容
- C++中的openCV Mat访问冲突
- OpenCV Android C++ imwrite not found
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- C++ OpenCV 卡尔曼滤波器构造函数错误
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 如何使用OpenCV-C++编写*.mp4视频?
- 在Android Studio中使用NDK GrabCut返回的OpenCV总是黑色面具