我使用opencv将android位图转换为grescale。下面是我使用的代码,
IplImage image = IplImage.create( bm.getWidth(), bm.getHeight(), IPL_DEPTH_8U, 4); //creates default image
bm.copyPixelsToBuffer(image.getByteBuffer());
int w=image.width();
int h=image.height();
IplImage grey=cvCreateImage(cvSize(w,h),image.depth(),1);
cvCvtColor(image,grey,CV_RGB2GRAY);
bm为源图像。这段代码可以很好地转换为灰度,我已经通过保存到sd卡然后再次加载进行了测试,但是当我尝试使用下面的方法加载它时,我的应用程序崩溃了,有什么建议吗?
bm.copyPixelsFromBuffer(grey.getByteBuffer());
iv1.setImageBitmap(bm);
iv1是imageview,我想在这里设置bm
我从未在Android上使用过OpenCV绑定,但这里有一些代码可以让你开始。把它当作伪代码吧,因为我不能试用它……但你会得到基本的想法。这可能不是最快的解决方案。我是从这个答案粘贴过来的。
public static Bitmap IplImageToBitmap(IplImage src) {
int width = src.width;
int height = src.height;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for(int r=0;r<height;r++) {
for(int c=0;c<width;c++) {
int gray = (int) Math.floor(cvGet2D(src,r,c).getVal(0));
bitmap.setPixel(c, r, Color.argb(255, gray, gray, gray));
}
}
return bitmap;
}
您的IplImage grey
只有一个通道,您的Bitmap bm
有4个或3个通道(ARGB_8888
, ARGB_4444
, RGB_565
)。因此bm
不能存储灰度图像。您必须在使用前将其转换为rgba。
的例子:(代码)
IplImage image = IplImage.create( bm.getWidth(), bm.getHeight(), IPL_DEPTH_8U, 4);
bm.copyPixelsToBuffer(image.getByteBuffer());
int w=image.width(); int h=image.height();
IplImage grey=cvCreateImage(cvSize(w,h),image.depth(),1);
cvCvtColor(image,grey,CV_RGB2GRAY);
如果你想加载它:(您可以重用您的image
或创建另一个temp
)
IplImage temp = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 4); // 4 channel
cvCvtColor(grey, temp , CV_GRAY2RGBA); //color conversion
bm.copyPixelsFromBuffer(temp.getByteBuffer()); //now should work
iv1.setImageBitmap(bm);
我可能会有帮助!