关于如何用纯OpenCV实现图片叠加的例子实在是太少,太多的是使用 C++,JNI实现的,如果要用C++的话,我们为啥不转行做C++

下面的例子基于 Android JavaCV 实现了在im_beauty 美女图片上  添加im_flower3 小花图片 并显示

需要在res/drawable目录下 放两个文件 im_beauty, im_flower3 注意im_flower3一定要比im_beauty图片尺寸要下小



package com.KyleOpencvImageAdd;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.core.Rect; import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView; public class MainActivity extends Activity implements OnClickListener { private Mat mat1,mat2;
private ImageView iv1,iv2;
//用于显示两张图片叠加
private ImageView iv3;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //初始化图片显示
iv1=(ImageView)findViewById(R.id.imageView1);
iv1.setImageResource(R.drawable.im_beauty); iv2=(ImageView)findViewById(R.id.imageView2);
iv2.setImageResource(R.drawable.im_flower3); iv3=(ImageView)findViewById(R.id.imageView3); btn=(Button)findViewById(R.id.button1);
btn.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i("", "OpenCV loaded successfully"); } break;
default:
{
super.onManagerConnected(status);
} break;
}
}
}; @Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//初始化函数库
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
} @Override
public void onClick(View arg0) {
// 初始化数据
mat1 = new Mat();
mat2 = new Mat();
Mat mat1Sub = new Mat(); // 加载图片
Bitmap bt1 = BitmapFactory.decodeResource(getResources(),
R.drawable.im_beauty);
Bitmap bt2 = BitmapFactory.decodeResource(getResources(),
R.drawable.im_flower3);
Bitmap bt3 = null; // 转换数据
Utils.bitmapToMat(bt1, mat1);
Utils.bitmapToMat(bt2, mat2); /** 方法一加权 高级方式 可实现水印效果*********/ // mat1Sub=mat1.submat(0, mat2.rows(), 0, mat2.cols());
// Core.addWeighted(mat1Sub, 1, mat2, 0.3, 0., mat1Sub); /** 方法二 求差 ********/ // submat(y坐标, 图片2的高, x坐标,图片2的宽);
// mat1Sub=mat1.submat(0, mat2.rows(), 0, mat2.cols());
// mat2.copyTo(mat1Sub); /*** 方法三兴趣区域裁剪 **/
// 定义感兴趣区域Rect(x坐标,y坐标,图片2的宽,图片2的高)
Rect rec = new Rect(0, 0, mat2.cols(), mat2.rows());
// submat(y坐标, 图片2的高, x坐标,图片2的宽);
mat1Sub = mat1.submat(rec);
mat2.copyTo(mat1Sub);
//转化为android识别的图像数据注意bt3的宽高要和mat1一至
bt3 = Bitmap.createBitmap(mat1.cols(), mat1.rows(), Config.RGB_565);
Utils.matToBitmap(mat1, bt3);
iv3.setImageBitmap(bt3); } }

处理上  bitmap  与mat 的 一定要注意 图片的宽高一致不然容易 Exception

/cv::error()(17079): OpenCV Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width ==

(uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file

/home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 97

/org.opencv.android.Utils(17079): nMatToBitmap catched cv::Exception: /home/reports/ci/slave/50-

SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows &&

info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong,

jobject, jboolean)

Android OpenCV实现图片叠加,水印的更多相关文章

  1. android图像处理系列之七--图片涂鸦,水印-图片叠加

    图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...

  2. javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...

  3. android 图片特效处理之 图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  4. android 图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  5. android图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  6. Android+openCV人脸检测2(静态图片)

    前几篇文章中有提到对openCV环境配置,这里再重新梳理导入和使用openCV进行简单的人脸检测(包括使用级联分类器) 一 首先导入openCVLibrary320 二 设置gradle的sdk版本号 ...

  7. C# GDI+ 简单实现图片写文字和图片叠加(水印)(转)

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  8. android图像处理系列之六-- 给图片添加边框(下)-图片叠加

    前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...

  9. android图像处理系列之六--给图片添加边框(下)-图片叠加

    前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...

随机推荐

  1. Change the ball(找规律)

    Change the ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. VS2010+ICE3.5运行官方demo报错----std::bad_alloc

    纠结了一晚上,在release版本下运行没问题,一到debug就报错,卡在 Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWith ...

  3. Web Service中的XFire 传输List 自定义对象.

    我把这个创建的步骤和代码的贴出来,. 首先新建一个工程,取名就随便点啦..MyWebService,然后复制jar包到lib目录下, 创建包,建立接口..写一个javaBean的类, 以下是一个简单的 ...

  4. 浅谈JavaScript DOM编程艺术读后感和一点总结

    最近工作不是很忙就想想想JavaScript的内部组成和一些要点,就是从这本书开始的.对新手来说还好,简单易懂. 简单终结下我重书中学到的一些要点. 下面都是个人学习的要点提取: 1.给自己预留退路, ...

  5. java替换字符串和用indexof查找字符

    java自带替换 String s="hlz_and_hourui哈哈"; String new_S=s.replaceAll("哈", "笑毛&qu ...

  6. .NET Printer(打印)详细分析

    如果你是一名开发人员,就不应该不知道.NET Framework.它的作用在编程人员眼中是非常强大的..NET Framework打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的 ...

  7. MySQL实用基础笔记

    /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysq ...

  8. 寻找最大数--nyoj题目448

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  9. IEnumerable

    C#基础之IEnumerable 1.IEnumerable的作用 在使用Linq查询数据时经常以IEnumerable<T>来作为数据查询返回对象,在使用foreach进行遍历时需要该对 ...

  10. 我所不知道的 Chrome 开发者工具

    http://www.oschina.net/translate/things-i-didnt-know-about-chrome-devtools 自打我开始进行Web开发后,我就一直将Firebu ...