android 使用NDK进行图像处理(openCV)时的图像转换问题(灰度图显示)

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:24px;"><span style="font-size:18px;">#include <jni.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <opencv2/opencv.hpp>  
  5. using namespace cv;  
  6. IplImage * change4channelTo3InIplImage(IplImage * src);  
  7. void imageAdjust(IplImage * src,IplImage * dst);  
  8. void Grayview(IplImage * src,int * dst,int width,int high);  
  9.   
  10. extern "C" {  
  11. JNIEXPORT jintArray JNICALL Java_jojo_testopencv_LibImgFun_ImgFun(  
  12.         JNIEnv* env, jobject obj, jintArray buf, int w, int h);  
  13. JNIEXPORT jintArray JNICALL Java_jojo_testopencv_LibImgFun_ImgFun(  
  14.         JNIEnv* env, jobject obj, jintArray buf, int w, int h) {  
  15.   
  16.     jint *cbuf;  
  17.     cbuf = env->GetIntArrayElements(buf,NULL);  
  18.     if (cbuf == NULL) {  
  19.         return 0;  
  20.     }  
  21.   
  22.     Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);  
  23.     IplImage image=IplImage(myimg);  
  24.     IplImage* image3channel = change4channelTo3InIplImage(&image);  
  25.   
  26.     IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);  
  27.     IplImage* pGrayImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);</span></span>  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:24px;"><span style="font-size:18px;">       cvCvtColor(image3channel,pGrayImage,CV_RGB2GRAY);//彩色图转换为灰度图</span></span>  


如上,使用jni调用C++代码处理图片时,现将得到的原图转为四通道IplImage类型,再转为三通道。接下来使用cvCvtColor()方法将三通道彩图转为单通道灰度图,以为这样得倒的灰度图可以直接传给java程序,如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:24px;">int* outImage=new int[w*h];  
  2. for(int i=0;i<w*h;i++)  
  3.     {  
  4.         outImage[i]=(int)pGrayImage->imageData[i];  
  5.   
  6.     }  
  7. int size = w * h;  
  8.     jintArray result = env->NewIntArray(size);  
  9.     env->SetIntArrayRegion(result, 0, size, outImage);  
  10.     env->ReleaseIntArrayElements(buf, cbuf, 0);  
  11.     return result;</span>  
可是得到的图片却不是灰度图,而是亮黄色

查资料才知道是自己对Iplimage类理解有误,就算是单通道,存储格式还是cv_RGB(r,g,b)

使用如下函数进行转换

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void Grayview(IplImage * src,int * dst,int width,int high){  
  2.   
  3.     int alpha = 0xFF << 24;  
  4.     int w = width,h = high;  
  5.     for (int i = 0; i<w*h; i++) {  
  6.   
  7.             // 获得像素的颜色  
  8.             int color = (int)src->imageData[i];  
  9.             int red = ((color & 0x00FF0000) >> 16);  
  10.             int green = ((color & 0x0000FF00) >> 8);  
  11.             int blue = color & 0x000000FF;  
  12.             color = (red + green + blue) / 3;  
  13.             color = alpha | (color << 16) | (color << 8) | color;  
  14.             dst[i] = color;  
  15.     }  
  16. }  
将第一部分代码作如下修改即可在Activity中显示灰色图片

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int* outImage=new int[w*h];  
  2. Grayview(enImage,outImage,w,h);  
  3.     int size = w * h;  
  4.     jintArray result = env->NewIntArray(size);  
  5.     env->SetIntArrayRegion(result, 0, size, outImage);  
  6.     env->ReleaseIntArrayElements(buf, cbuf, 0);  
  7.     return result;  
不过得到的灰色图片却比原图的要淡一些,不知道为什么,希望知道的人能指点一二
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值