Android Bitmap's format and IplImage's format matching is very important

原创 2013年12月06日 09:37:52
最近在做录像的项目,通过bitmap.copyPixelsToBuffer老是出现java.lang.RuntimeException: Buffer not large enough for pixels的错误。查找了一下原因。

Android Bitmap's format and IplImage's format matching is very important.


JavaCV处理图像格式多为IplImage格式,而Android程序里的ImageView组件无法直接显示IplImage格式图像,所以需要转化格式。通过将图片像素载入buffer的方式,实现将Bitmap格式图片转换为IplImage格式图片。建立4通道IplImage图像对应Bitmap数据格式为ARGB_8888;建立2通道IplImage图像对应Bitmap数据格式为RGB_565

public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	
	LinearLayout layout = (LinearLayout)findViewById(R.id.root);
	ImageView image = new ImageView(this);
	layout.addView(image);

	Bitmap bitmapIn = BitmapFactory.decodeResource(getResources(), R.drawable.abc);
	IplImage newin = IplImage.create(bitmapIn.getWidth(), bitmapIn.getHeight(), IPL_DEPTH_8U, 4);
	bitmapIn.copyPixelsToBuffer(newin.getByteBuffer()); 
	
	cvFlip(newin, newout, 0);//图像旋转
	
	IplImage newout = IplImage.create(bitmapIn.getWidth(), bitmapIn.getHeight(),IPL_DEPTH_8U, 4);
	Bitmap bitmapOut = Bitmap.createBitmap(bitmapIn.getWidth(), bitmapIn.getHeight(), Bitmap.Config.ARGB_8888);
	bitmapOut.copyPixelsFromBuffer(newout.getByteBuffer());
	image.setImageBitmap(bitmapOut);
}

IplImage image = IplImage.create(width, height, IPL_DEPTH_8U, 4);IplImage _3image = IplImage.create(width, height, IPL_DEPTH_8U, 3);IplImage _1image = IplImage.create(width, height, IPL_DEPTH_8U, 1);Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);1. iplimage -> bitmapbitmap.copyPixelsFromBuffer(image.getByteBuffer());2. bitmap -> iplimagebitmap.copyPixelsToBuffer(image.getByteBuffer());3. iplimage(4channel) -> iplimage(3channel or 1channel)cvCvtColor(image, _3image, CV_BGRA2BGR);cvCvtColor(_3image, _1image, CV_RGB2GRAY);-----------------------------------------------------------------------------------Create iplimage from Android's camera byte[] dataprivate IplImage _4iplToBitmap;_4iplToBitmap = IplImage.create(width, height, IPL_DEPTH_8U, 4);int [] _temp = new int[width*height];if(_4iplToBitmap!= null){ decodeYUV420SP(_temp, data, width, height); _4iplToBitmap.getIntBuffer().put(_temp);}protected void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) { int frameSize = width * height; for (int j = 0, yp = 0; j < height; j++) { int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; for (int i = 0; i < width; i++, yp++) { int y = (0xff & ((int) yuv420sp[yp])) - 16; if (y < 0) y = 0; if ((i & 1) == 0) { v = (0xff & yuv420sp[uvp++]) - 128; u = (0xff & yuv420sp[uvp++]) - 128; } int y1192 = 1192 * y; int r = (y1192 + 1634 * v); int g = (y1192 - 833 * v - 400 * u); int b = (y1192 + 2066 * u); if (r < 0) r = 0; else if (r > 262143) r = 262143; if (g < 0) g = 0; else if (g > 262143) g = 262143; if (b < 0) b = 0; else if (b > 262143) b = 262143; rgb[yp] = 0xff000000 | ((b << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((r >> 10) & 0xff); } }}

String.format()方法使用说明

JDK1.5开始String类中提供了一个非常有用的方法String.format(String format, Object ... args) 查看源码得知其实是调用了java.util.For...
  • thc1987
  • thc1987
  • 2013年12月24日 15:48
  • 69256

开发手记--android布局用占位符%1$s

在开发中,如果遇到如下listview的item布局,以前总是把“物料名称:”作为一个TextView,后面具体值作为一个TextView。这样做使得布局变得很繁琐。后来发现可以使用占位符%1$s使其...
  • u011384042
  • u011384042
  • 2017年06月18日 14:06
  • 332

Delphi的format使用总结

1.Format 根据指定所需要的格式,格式化字符串。 原型: function Format(const Format: string; const Args: array of const): s...
  • songchao_2011
  • songchao_2011
  • 2014年02月21日 12:49
  • 2279

CString Format的用法(转)

在MFC中会经常用到CString::Format。下面是我收集的一些资料。 官方定义: CString::Format void Format( LPCTSTR lpszFormat, .....
  • Linoi
  • Linoi
  • 2014年05月21日 10:06
  • 1821

swift基本语法(总结提炼版)之009 swift 之字符串

字符串 在 Swift 中绝大多数的情况下,推荐使用 String 类型 使用 String 的原因 String 是一个结构体,性能更高 String 目前具有了绝大多数 N...
  • sunnyboy9
  • sunnyboy9
  • 2016年02月24日 23:12
  • 495

String.format的用法(字符串格式化)

String.format返回的是String类型的字符串 1.在string.xml里加入 绑定成员数量不能超过%d 2.java代码里就可以这样用 String.format(mRes.getSt...
  • wdy3110411073
  • wdy3110411073
  • 2015年12月30日 11:20
  • 2508

Format类及其子类功能和用法详解

Format 是一个用于格式化语言环境敏感的信息(如日期、消息和数字)的抽象基类。 Format 定义了编程接口,用于将语言环境敏感的对象格式化为String(使用 format 方法)和将 Stri...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2014年08月30日 13:43
  • 2262

Python格式化字符 %s %d %f

格式 描述 %% 百分号标记 #就是输出一个% %c 字符及其ASCII码 %s 字符串 %d 有符号整数(十进制) %u 无符号整数(十进制) %o 无符号整数(八进制) %x 无符号整数(十六进制...
  • huangfu77
  • huangfu77
  • 2017年02月01日 09:37
  • 11355

CString与char*转换(Unicode和多字节字符集)

一、使用多字节字符集 1.CString转char* (1)传给未分配内存的const char* (LPCTSTR)指针.  CString cstr="ABC"; const char* ch =...
  • BCD_not_CBD
  • BCD_not_CBD
  • 2015年08月29日 10:20
  • 281

struts2标签<s:date>的使用

最近研究struts时,发现这个标签能够解决很多格式上的问题,所以在网上搜索了一下这个内容,发现这篇文章写得挺不错的,挺有收获。 struts 标签 : 作用:用来格式化显示日期的格式。如:s:da...
  • z69183787
  • z69183787
  • 2014年03月05日 12:49
  • 11909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Bitmap's format and IplImage's format matching is very important
举报原因:
原因补充:

(最多只允许输入30个字)