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
msrcmat. - 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
bgramat array of pixels. usememcpy. iterate on each row ofbgramat , 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.

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
Post a Comment