这片博文简单介绍怎样使用OpenCV的函数,由于就是那么几个函数,本文就以绘制一个椭圆为例,简单做一个Demo并说明下需要注意的问题
先上Java层代码,就是搞了一个白色的Bitmap进去,模式为ARGB通道数为4
private void drawEllipseTest(){
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);
}
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(0);
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, ptr);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
按照惯例上一张效果图:
最后我推荐下毛星云编著的《OpenCV 3 编程入门》,这本书讲的是在PC平台上的OpenCV开发,现在本人一点点的向Android平台移植,还多谢大家捧场