我正在使用一个使用OpenCV的facedetect Android应用程序 2.3.1库。我找到了一些允许我拍照的代码 我的三星GT-P1000并将其保存在图库中。然后我想选择 图库中允许.cpp文件使用OpenCV的图像 功能。这需要一个ImapImage转换的位图(.java 和.cpp代码片段在下面添加。)
java代码如下所示:
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentImagePath);
Log.i(TAG, mCurrentImagePath);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
opencv.setSourceImage(pixels, width, height);
byte[] imageData = opencv.getSourceImage();
bitmap = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length);
mImageView.setImageBitmap(bitmap);
C ++代码如下所示:
IplImage * pImage = NULL;
IplImage * loadpixels(int * pixels, int width, int height);
IplImage * getIplImageFromIntArray
(JNIEnv* env, jintArray array_data, jint width, jint height);
JNIEXPORT jboolean JNICALL Java_org_opencv_example_pruts_Test1OpenCV_setSourceImage
(JNIEnv * env, jobject thiz, jintArray photo_data, jint width, jint height)
{
if(pImage != NULL)
{
cvReleaseImage(&pImage);
pImage = NULL;
}
pImage = getIplImageFromIntArray(env, photo_data, width, height);
if(pImage == 0)
{
return 0;
}
return 1;
}
但是我需要另一个转换IplImage的JNIEXPORT函数 到位图数据。因此,将使用最后4行代码。应填充imageData,以便BitmapFactory可以对其进行解码。我遇到了很多示例,这些代码片段也来自这些代码片段。但是我无法找到解决问题的方法。有人有什么建议吗?
答案 0 :(得分:4)
您似乎打算使用压缩格式,这是可行的,但很复杂。 在这里,我使用未压缩的数据给出解决方案。 因为android中的Bitmap基本上是rgba格式,所以你可以直接使用IplImage数据创建位图,除了字节对齐问题。
JNIEXPORT jintArray JNICALL Java_org_opencv_example_pruts_Test1OpenCV_getSourceImage
(JNIEnv * env, jobject thiz){
if(pImage == 0)
{
return NULL;
}
int len = pImage->width * pImage->height * 4;
jintArray rgbaData = env->NewIntArray(len);
if(pImage->nChannels == 4){
env->SetIntArrayRegion(rgbaData,0,len,(jint*)pImage->imageData);
}else if(pImage->nChannels == 3){
IplImage* t = cvCreateImage(cvGetSize(pImage),8,4);
for(int h = 0; h< pImage->height; h++){
char* pt= t->imageData + h * t->widthStep;
char* pImg = pImage->imageData+ h * pImage->widthStep;
for(int w =0 ; w < pImage->width; w++){
memcpy(pt,pImg,3);
pt[3] = 255;//alpha
pt+=4;
pImg += 3;
}
}
env->SetIntArrayRegion(rgbaData,0,len,(jint*)t->imageData);
cvReleaseImage(&t);
}else {
// if pImage -> nChannels == 1 , handle it in the way you prefer
// I donot think your image is gray ,so forget about this situation
}
cvReleaseImage(&pImage);
return rgbaData;
}
java代码应该是这样的:
int[] imageData = opencv.getSourceImage();
bitmap = Bitmap.createBitmap(imageData, 0, width,width, height, Config.ARGB_8888);