java - Program running but not displaying result using native android -


this jni file , native.cpp

    extern "c"  java_org_opencv_samples_nativeactivity_cvnativeactivity_cannyjni(         jnienv* env, jobject thiz,         jint height, jint width, jintarray in, jintarray out) {     //get data pointer.     jint* _in = env->getintarrayelements(in, 0);     jint* _out = env->getintarrayelements(out, 0);       //build mat structure input data     mat msrc(height, width, cv_8uc4, (unsigned char *)_in);     //build mat structure output data     mat bgr(height, width, cv_8uc4, (unsigned char *)_out);      //convert mat iplimage     iplimage msrcimg = msrc;     iplimage moutimg = bgr;      //create gray image input data.     iplimage * msrcgrayimg = cvcreateimage(cvgetsize(&msrcimg), msrcimg.depth, 1);     iplimage * moutgrayimg = cvcreateimage(cvgetsize(&msrcimg), msrcimg.depth, 1);      iplimage *b,*g,*r;     b = cvcreateimage( cvgetsize(msrcgrayimg), 8, 1 );     g = cvcreateimage( cvgetsize(msrcgrayimg), 8, 1 );     r = cvcreateimage( cvgetsize(msrcgrayimg), 8, 1 ) ;      cvsplit(&msrcimg, b, g, r, 0 );     cvequalizehist( b, b );     cvequalizehist( g, g );     cvequalizehist( r, r );     cvmerge(b,g,r,0,&moutimg);     //release pointer.     env->releaseintarrayelements(in, _in, 0);     env->releaseintarrayelements(out, _out, 0);     return true; } 

when add these 2 lines every jni part work me

cvcvtcolor(moutgrayimg, msrcgrayimg, cv_bgr2ycrcb); cvcvtcolor(msrcgrayimg, &moutimg , cv_ycrcb2bgr); 

like above code when add

cvmerge(b,g,r,0,moutgrayimg); cvcvtcolor(moutgrayimg, msrcgrayimg, cv_bgr2ycrcb); cvcvtcolor(msrcgrayimg, &moutimg , cv_ycrcb2bgr); 

it runs , , same other codes , can please tell me why , how ? , how can rid of these 2 lines , cvmerge(b,g,r,0,moutgrayimg); lines send output image , how can set c++ interface code.

here jave file contain cvnativeactivity.java

public class cvnativeactivity extends activity implements cvcameraviewlistener2 {        public native boolean brightnessjni(int width, int height, int [] mphotointarray, int [] mcannyoutarray);      static      {         system.loadlibrary("native_activity");     }     /** called when activity first created. */      imageview imageview_1;     imageview imageview_2;     @override     public void oncreate(bundle savedinstancestate)      {         super.oncreate(savedinstancestate);         setcontentview(r.layout.main);          imageview_1=(imageview) findviewbyid(r.id.imageview1);          imageview_2=(imageview) findviewbyid(r.id.imageview2);          inputstream is;         = this.getresources().openrawresource(r.drawable.foot);         bitmap bminimg = bitmapfactory.decodestream(is);          int [] mphotointarray;         int [] mcannyoutarray;          mphotointarray = new int[bminimg.getwidth() * bminimg.getheight()];         // copy pixel data bitmap 'intarray' array         bminimg.getpixels(mphotointarray, 0, bminimg.getwidth(), 0, 0, bminimg.getwidth(), bminimg.getheight());          //create brightness result buffer         mcannyoutarray = new int[bminimg.getwidth() * bminimg.getheight()];          //         // brightness         //         brightnessjni(bminimg.getheight(), bminimg.getwidth(), mphotointarray, mcannyoutarray);          //         // convert result bitmap         //         bitmap bmoutimg = bitmap.createbitmap(bminimg.getwidth(), bminimg.getheight(), config.argb_8888);           bmoutimg.setpixels(mcannyoutarray, 0, bminimg.getwidth(), 0, 0, bminimg.getwidth(), bminimg.getheight());           imageview_2.setimagebitmap(bmoutimg);          //         // save result file         //         string extstoragedirectory = environment.getexternalstoragedirectory().tostring();         string outfilename = extstoragedirectory + "/brightness";          outputbitmaptofile(bmoutimg, outfilename);          }      void outputbitmaptofile(bitmap inbm, string filename)     {         bytearrayoutputstream bytes = new bytearrayoutputstream();         inbm.compress(bitmap.compressformat.png, 100, bytes);          file f = new file(filename);         try         {             f.createnewfile();             //write bytes in file             fileoutputstream fo = new fileoutputstream(f);             fo.write(bytes.tobytearray());         }          catch (exception e)          {             e.printstacktrace();         }                } } 

thanks

well, found issue. it's not showing image because have put alpha channel 0 in cvmerge. bitmap of rgba format. , alpha 0. hence complete black image.

here's c api implementation code. works.

#include <jni.h> #include <stdio.h> #include "opencv2/core/core.hpp" #include <opencv2/imgproc/imgproc_c.h>  using namespace std; using namespace cv;  extern "c" {     jniexport jint jnicall      java_com_fenchtose_equalizehist_eqactivity_eqhist(             jnienv* env, jobject,             jint width, jint height, jintarray in, jintarray out)     {         jint* _in = env->getintarrayelements(in, 0);         jint* _out = env->getintarrayelements(out, 0);          mat msrc(height, width, cv_8uc4, (unsigned char*)_in);         mat bgra(height, width, cv_8uc4, (unsigned char*)_out);          iplimage msrcimg = msrc;         iplimage moutimg = bgra;          iplimage *b, *g, *r, *a;          b = cvcreateimage(cvsize(width, height), msrcimg.depth, 1);         g = cvcreateimage(cvsize(width, height), msrcimg.depth, 1);         r = cvcreateimage(cvsize(width, height), msrcimg.depth, 1);         = cvcreateimage(cvsize(width, height), msrcimg.depth, 1);          cvsplit(&msrcimg, b, g, r, a);         cvequalizehist(b, b);         cvequalizehist(g, g);         cvequalizehist(r, r);          cvmerge(b, g, r, a, &moutimg); // merge alpha layer         jint retval;         int ret = 1;         retval = jint(retval);          env->releaseintarrayelements(in, _in, 0);         env->releaseintarrayelements(out, _out, 0);          return retval;       } } 

old answer: copied java file. made minor changes. (showed original image in imageview1, changed native function call).

here's jni file.

#include <jni.h> #include <stdio.h> #include "opencv2/core/core.hpp" #include <opencv2/imgproc/imgproc.hpp> #include <vector>  using namespace std; using namespace cv;  extern "c" {     jniexport jint jnicall      java_com_example_equalizehist_eqactivity_eqhist(             jnienv* env, jobject,             jint width, jint height, jintarray in, jintarray out)     {         jint* _in = env->getintarrayelements(in, 0);         jint* _out = env->getintarrayelements(out, 0);          mat msrc(height, width, cv_8uc4, (unsigned char*)_in);         mat bgra(height, width, cv_8uc4);          vector<mat> schannels;         split(msrc, schannels);          for(int i=0; i<schannels.size(); i++)         {             equalizehist(schannels[i], schannels[i]);         }          merge(schannels, bgra);          for(int i=0; i<height; i++)         {             memcpy(&(_out[i*width]), &(bgra.data[i*bgra.step]), width*bgra.channels());         }          env->releaseintarrayelements(in, _in, 0);         env->releaseintarrayelements(out, _out, 0);          jint retval;         int ret = 1;         retval = jint(retval);         return retval;     } } 
  • step1: pass pixel(int arrays) native function.
  • step2: create mat input pixels.
  • step3: create empty vector hold each channel of msrc mat.
  • step4: split msrc mat schannels vector.
  • step5: apply equalizehist function on each channel. loop on schannels vector.
  • step6: merge channels in bgra mat.
  • step7: copy data of bgra mat array of pixels. use memcpy. iterate on each row of bgra mat , copy data of each channel. cv_8uc4 mat. each channel have data of 2 bytes. each pixel contain 8 bytes of data.
  • step8: release arrays.

here's screenshot of app.

enter image description here

i have put code on github. might want check if run issues.

note: if you're using code, make sure declare native function correctly.

if don't want use memcpy, can directly allocate

#include <jni.h> #include <stdio.h> #include "opencv2/core/core.hpp" #include <opencv2/imgproc/imgproc.hpp> #include <vector>  using namespace std; using namespace cv;  extern "c" {     jniexport jint jnicall      java_com_example_equalizehist_eqactivity_eqhist(             jnienv* env, jobject,             jint width, jint height, jintarray in, jintarray out)     {         jint* _in = env->getintarrayelements(in, 0);         jint* _out = env->getintarrayelements(out, 0);          mat msrc(height, width, cv_8uc4, (unsigned char*)_in);         mat bgra(height, width, cv_8uc4, (unsigned char*)_out);          vector<mat> schannels;         split(msrc, schannels);          for(int i=0; i<schannels.size(); i++)         {             equalizehist(schannels[i], schannels[i]);         }          merge(schannels, bgra);         env->releaseintarrayelements(in, _in, 0);         env->releaseintarrayelements(out, _out, 0);          jint retval;         int ret = 1;         retval = jint(retval);         return retval;     } } 

even working properly.


Comments

Popular posts from this blog

javascript - jquery or ashx not working -

opencv - DataType<cv::detail::deriv_type>::depth what is it used for -

python 3.x - Mapping specific letters onto a list of words -