Rocket
Rocket

Reputation: 553

How to deal with 8UC3 and 8UC4 simultaneously in android ndk

My code is working fine with showing brightness in the image using below code

   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++)
        {
            Mat channel = sChannels[i];
            equalizeHist(channel, channel);
        }
        merge(sChannels, bgra);
   env->ReleaseIntArrayElements(in, _in, 0);
   env->ReleaseIntArrayElements(out, _out, 0);

   jint retVal;
   int ret = 1;
   retVal = jint(retVal);
   return retVal;

It work for me too for changing image into grayscale but in this way :

   Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
   Mat gray(height, width, CV_8UC1);
   Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);
   cvtColor(mSrc , gray , CV_BGRA2GRAY);
   cvtColor(gray , bgra , CV_GRAY2BGRA);

But when i am trying to use bilateralfilter with it , which only work with 3 channels as given here , how to deal with it ? because java bitmap accept RGBA format ,and when i change the above into

Mat mSrc(height, width, CV_8UC3, (unsigned char*)_in); 
Mat bgra(height, width, CV_8UC3, (unsigned char*)_in);

somehow bilateral filter show me output , but what if I have apply all these filter on one image ? how can I handle this problem ? because there may be other algorithms too which only deal with 3 channels.

Upvotes: 1

Views: 1904

Answers (1)

alvaro.delaserna
alvaro.delaserna

Reputation: 549

If you need to convert CV_8UC3 to CV_8UC4 you just need to call:

cvtColor(src, dst, CV_BGR2BGRA);

since it outputs a 4-channel image (R, G, B and Alpha)

Inversely,

cvtColor(src, dst, CV_BGRA2BGR);

should convert CV_8UC4 to CV_8UC3

Upvotes: 1

Related Questions