您的位置:首页 > 移动开发 > Android开发

Android平台下使用OpenCV绘制图形

2016-07-08 21:47 447 查看
这片博文简单介绍怎样使用OpenCV的函数,由于就是那么几个函数,本文就以绘制一个椭圆为例,简单做一个Demo并说明下需要注意的问题

先上Java层代码,就是搞了一个白色的Bitmap进去,模式为ARGB通道数为4

private void drawEllipseTest(){
<span style="white-space:pre">	</span>Bitmap bitmap =  Bitmap.createBitmap(400, 300, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);

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.drawEllipse(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层代码,一些Java到native数据类型转换这里就不介绍了,都是些模版式的代码。其中ellipse是椭圆绘制函数,各个参数大意如下

srcImage 为要绘制的Mat

Point 为椭圆中心点

Size 为椭圆宽高

angle 为转旋转角度

0和360 为扩展的角度

Scalar 为椭圆线的颜色,注意上面强调了图像通道数是4,因此我们要表示红色就要写四个参数Scalar(0,0,255,255)分别对应BGRA

thickness 为线宽,-1的话表示实心

lineType 表示通用线型

JNIEXPORT jintArray JNICALL Java_yu_myself_opencv_jni_OpenCVHelper_drawEllipse(
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);

int thickness = 2;
int lineType = 8;
int angle = 45;

ellipse(srcImage,
Point(w / 2, h / 2),
Size(w / 4, h / 8),
angle,
0,
360,
Scalar(255, 255, 0, 255),
thickness,
lineType
);

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;
}


按照惯例上一张效果图:



这里简单介绍了椭圆函数的使用方法,当然OpenCV绘制图形不仅仅这一种,还有circle绘制圆、fillPloy绘制多边形、line绘制线等等大家可以自己尝试下。虽说OpenCV可以绘制图形,但是我个人还是更喜欢通过Android的Canvas绘制,毕竟java稍微方便一点。
最后我推荐下毛星云编著的《OpenCV 3 编程入门》,这本书讲的是在PC平台上的OpenCV开发,现在本人一点点的向Android平台移植,还多谢大家捧场
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android opencv jni