我正在尝试访问Ipl
Image的Pixel by Pixel.我使用
Java和Processing,有时我需要逐像素访问.到目前为止我已经这样做了,但我不知道出了什么问题:
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异常:
imageDst = IplImage.create(imageSrc.width,3); CvMat imagePixels = CvMat.createHeader(imageDst.height(),imageDst.width(),CV_32FC1); cvGetMat(imageDst,imagePixels,null,0); int locPImage,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,scalar); } imageDst = new IplImage(imagePixels);
解决方法
迭代JavaCV中每个像素的最快方法是:
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); } }