Android平台下使用OpenCV绘制图形

这片博文简单介绍怎样使用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平台移植,还多谢大家捧场

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值