How to fix 'only black frames receiving' in Android with OpenCV
I was developing a Augmented Reality feature similar to inkHunter for a mobile application using python and openCV. The code worked well as I expected even-though it had some over-kills. I needed to make an android app and I knew that I need to convert that python code to C++ and run it in android with ndk since it had a real-time process. I was able to load openCV libraries to my android project and pass data between native class and the MainActivity as well. Then I converted my python code to C++(which is I'm not much familiar with) and then ran the project. But it gives me only black frames. The program shows no errors, but I don't get the expected output.
I'm trying with Android Studio 3.3.2 and OpenCV4Android 4.1.0
I used templateMatching method to detect the input template from the captured frame and then paste a png on the detected area using alpha blending and finally add that area to the frame using homography.
This is my code,
MainActivity.java
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
private static String TAG = "MainActivity";
private JavaCameraView javaCameraView;
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
System.loadLibrary("opencv_java4");
}
private Mat mRgba;
BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch(status){
case BaseLoaderCallback.SUCCESS:{
javaCameraView.enableView();
break;
}
default:{
super.onManagerConnected(status);
break;
}
}
}
};
private Mat temp, tattoo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
javaCameraView.setVisibility(SurfaceView.VISIBLE);
javaCameraView.setCvCameraViewListener(this);
AssetManager assetManager = getAssets();
try {
InputStream is = assetManager.open("temp.jpg");
Bitmap bitmap = BitmapFactory.decodeStream(is);
Bitmap bmp32 = bitmap.copy(Bitmap.Config.ARGB_8888, true);
temp = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4);
Utils.bitmapToMat(bmp32, temp);
} catch (IOException e) {
e.printStackTrace();
}
try {
InputStream isTattoo = assetManager.open("tattoo2.png");
Bitmap bitmapTattoo = BitmapFactory.decodeStream(isTattoo);
Bitmap bmp32Tattoo = bitmapTattoo.copy(Bitmap.Config.ARGB_8888, true);
tattoo = new Mat(bitmapTattoo.getHeight(), bitmapTattoo.getWidth(), CvType.CV_8UC4);
Utils.bitmapToMat(bmp32Tattoo, tattoo);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onPause(){
super.onPause();
if(javaCameraView != null){
javaCameraView.disableView();
}
}
@Override
protected void onDestroy(){
super.onDestroy();
if(javaCameraView != null){
javaCameraView.disableView();
}
}
@Override
protected void onResume(){
super.onResume();
if(OpenCVLoader.initDebug()){
Log.i(TAG, "OpenCV Loaded successfully ! ");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}else{
Log.i(TAG, "OpenCV not loaded ! ");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
}
}
@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
}
@Override
public void onCameraViewStopped() {
mRgba.release();
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
augmentation(mRgba.getNativeObjAddr(), temp.getNativeObjAddr(), tattoo.getNativeObjAddr());
return mRgba;
}
public native void augmentation(long matAddrRgba, long tempC, long tattooDesign);
}
native-lib.cpp
#include <jni.h>
#include <string>
#include <opencv2/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
extern "C" {
// Alpha Blending using direct pointer access
Mat& alphaBlendDirectAccess(Mat& alpha, Mat& foreground ...