IplImage像素访问JavaCV [英] IplImage Pixel Access JavaCV

查看:333
本文介绍了IplImage像素访问JavaCV的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试访问IplImage的像素.我正在使用Java和Processing,有时我需要逐像素访问.到目前为止,我已经完成了此操作,但是我不知道出了什么问题:

I'm trying to access Pixel by Pixel of an IplImage. Im using Java and Processing, and sometimes I need to access pixel by pixel. I've done this so far, but I don't know what's wrong:

public IplImage PImageToIplImage(PImage imageSrc)
    {
        IplImage imageDst;
        if(imageSrc.format==RGB)
        {
            imageDst = IplImage.create(imageSrc.width, imageSrc.height, IPL_DEPTH_8U, 3);
            ByteBuffer imagePixels=imageDst.getByteBuffer();
            int locPImage, locIplImage, x, y;
            for(y=0; y<imageSrc.height; y++)
                for(x=0; x<imageSrc.width; x++)
                {
                    locPImage = x + y * width;
                    locIplImage=y*imageDst.widthStep()+3*x;
                    imagePixels.put(locIplImage+2, (byte)(red(imageSrc.pixels[locPImage])));
                    imagePixels.put(locIplImage+1, (byte)(green(imageSrc.pixels[locPImage])));
                    imagePixels.put(locIplImage, (byte)(blue(imageSrc.pixels[locPImage])));
                }
        }
}

卡尔·菲利普(Karlphilip)提出建议后,我来到了这里,但仍然无法正常工作.当我尝试显示时,它给了我一个nullPointer异常:

After Karlphilip sugestion, I came to this, still doens't work. When I try to show, it gives me a nullPointer exception:

imageDst = IplImage.create(imageSrc.width, imageSrc.height, IPL_DEPTH_8U, 3);
CvMat imagePixels = CvMat.createHeader(imageDst.height(), imageDst.width(), CV_32FC1);  
cvGetMat(imageDst, imagePixels, null, 0); 
int locPImage, x, y;
for(y=0; y<imageSrc.height; y++)
   for(x=0; x<imageSrc.width; x++)
   {
       locPImage = x + y * width;
       CvScalar scalar = new CvScalar();
       scalar.setVal(0, red(imageSrc.pixels[locPImage]));
       scalar.setVal(1, green(imageSrc.pixels[locPImage]));
       scalar.setVal(2, blue(imageSrc.pixels[locPImage]));
       cvSet2D(imagePixels, y, x, scalar);
   }
   imageDst = new IplImage(imagePixels); 

推荐答案

迭代JavaCV中每个像素的最快方法是:

The fastest way to iterate over each pixel in JavaCV is:

ByteBuffer buffer = image.getByteBuffer();

for(int y = 0; y < image.height(); y++) {
    for(int x = 0; x < image.width(); x++) {
        int index = y * image.widthStep() + x * image.nChannels();

        // Used to read the pixel value - the 0xFF is needed to cast from
        // an unsigned byte to an int.
        int value = buffer.get(index) & 0xFF;

        // Sets the pixel to a value (greyscale).
        buffer.put(index, value);

        // Sets the pixel to a value (RGB, stored in BGR order).
        buffer.put(index, blue);
        buffer.put(index + 1, green);
        buffer.put(index + 2, red);
    }
}

这篇关于IplImage像素访问JavaCV的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆