本次博文我们简单讲解下怎么在Android平台下通过OpenCV设置ROI(Region of interest),通过设置感兴趣的区域实现复制原图的一小块区域。
Java层代码,就是读入了一张图片放到了Bitmap中,然后将像素数组传递到native层:
private void roiTest(){
Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.food)).getBitmap();
int w = bitmap.getWidth(), h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int[] resultPixes = OpenCVHelper.ROI(pix, w, h);
Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
result.setPixels(resultPixes, 0, w, 0, 0, w, h);
imageView.setImageBitmap(result);
}
JNIEXPORT jintArray JNICALL Java_yu_myself_opencv_jni_OpenCVHelper_ROI(
JNIEnv *env, jclass obj, jintArray buf, int w, int h){
jint *cbuf;
cbuf = env->GetIntArrayElements(buf, JNI_FALSE);
if (cbuf == NULL) {
return 0;
}
Mat srcImage(h, w, CV_8UC4, (unsigned char *) cbuf);
//拷贝需要复制的图像区域
Mat partImage;
srcImage(Rect(0, 0, 100, 100)).copyTo(partImage);
//得到圈出ROI的Mat
Mat ROIImage = srcImage(Rect(80, 120, 100, 100));
//加载掩模,必须是灰度图
Mat mark;
cvtColor(partImage, mark, COLOR_BGRA2GRAY);
//合并
partImage.copyTo(ROIImage, mark);
jint* ptr = srcImage.ptr<jint>(0);
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, ptr);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
最后按照惯例上一张效果图给大家增加安全感: