灰度 Iplimage 转 android 位图

发布于 2024-12-06 09:40:22 字数 685 浏览 1 评论 0原文

我正在使用 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。

I am using opencv to convert android bitmap to grescale by using opencv. below is the code i am using,

          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 is source image. This code works fine and converts to greyscale, i have tested it by saving to sdcard and then loading again, but when i try to load it using below method my app crashes, any suggestions.

                bm.copyPixelsFromBuffer(grey.getByteBuffer());
               iv1.setImageBitmap(bm);

iv1 is imageview where i want to set the bm.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

葬花如无物 2024-12-13 09:40:22

我从未使用过适用于 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;
}

I've never used the OpenCV bindings for Android, but here's some code to get you started. Regard it as pseudocode, because I can't try it out... but you'll get the basic idea. It may not be the fastest solution. I'm pasting from this answer.

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;
}
雨的味道风的声音 2024-12-13 09:40:22

您的 IplImage grey 只有一个通道,而您的 Bitmap bm 有 4 或 3 个通道(ARGB_8888ARGB_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);

如果你想加载它:
(您可以重复使用您的图像或创建另一个图像(临时))

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);

我可能会有所帮助!

Your IplImage grey has only one channel, and your Bitmap bm has 4 or 3 (ARGB_8888, ARGB_4444, RGB_565). Therefore the bm can't store the greyscale image. You have to convert it to rgba before use.

Example:
(your code)

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);

If you want to load it:
(You can reuse your image or create another one (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);

I might it will help!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文