Android平台下使用OpenCV设置ROI
2016-07-10 17:01
387 查看
本次博文我们简单讲解下怎么在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);
}
native层代码,大致意思就是在图的左上角圈了100x100的区域并且复制到partImage中,然后以 (80, 120) 为起点圈出100x100的区域为目标区域,最后加在灰度掩模合并即可:
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;
}
最后按照惯例上一张效果图给大家增加安全感:
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);
}
native层代码,大致意思就是在图的左上角圈了100x100的区域并且复制到partImage中,然后以 (80, 120) 为起点圈出100x100的区域为目标区域,最后加在灰度掩模合并即可:
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;
}
最后按照惯例上一张效果图给大家增加安全感:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories