Android平台下使用OpenCV绘制图形
2016-07-08 21:47
447 查看
这片博文简单介绍怎样使用OpenCV的函数,由于就是那么几个函数,本文就以绘制一个椭圆为例,简单做一个Demo并说明下需要注意的问题
先上Java层代码,就是搞了一个白色的Bitmap进去,模式为ARGB通道数为4
接下来是native层代码,一些Java到native数据类型转换这里就不介绍了,都是些模版式的代码。其中ellipse是椭圆绘制函数,各个参数大意如下
srcImage 为要绘制的Mat
Point 为椭圆中心点
Size 为椭圆宽高
angle 为转旋转角度
0和360 为扩展的角度
Scalar 为椭圆线的颜色,注意上面强调了图像通道数是4,因此我们要表示红色就要写四个参数Scalar(0,0,255,255)分别对应BGRA
thickness 为线宽,-1的话表示实心
lineType 表示通用线型
按照惯例上一张效果图:
![](https://img-blog.csdn.net/20160708214629669?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这里简单介绍了椭圆函数的使用方法,当然OpenCV绘制图形不仅仅这一种,还有circle绘制圆、fillPloy绘制多边形、line绘制线等等大家可以自己尝试下。虽说OpenCV可以绘制图形,但是我个人还是更喜欢通过Android的Canvas绘制,毕竟java稍微方便一点。
最后我推荐下毛星云编著的《OpenCV 3 编程入门》,这本书讲的是在PC平台上的OpenCV开发,现在本人一点点的向Android平台移植,还多谢大家捧场
先上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平台移植,还多谢大家捧场
相关文章推荐
- 使用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的冲突问题