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\
The following code loads an image from the disk and performs a grayscale conversion by iterating over the pixels of the image:
IplImage image = cvLoadImage("pipeline.png", CV_LOAD_IMAGE_COLOR);
if (image == null)
{
System.out.println("Erro ao carregar imagem!");
return;
}
double r, g, b;
r = g = b = 0.0;
CvMat mtx = CvMat.createHeader(image.height(), image.width(), CV_32FC1);
cvGetMat(image, mtx, null, 0);
System.out.println(mtx.rows() + "x" + mtx.cols());
for (int i = 0; i < mtx.rows(); i++)
{
for (int j = 0; j < mtx.cols(); j++)
{
CvScalar rgb = cvGet2D(mtx, i, j);
r = rgb.val(0);
g = rgb.val(2);
b = rgb.val(1);
double gray = (r + g + b) / 3;
CvScalar scalar = new CvScalar();
scalar.setVal(0, gray);
scalar.setVal(1, gray);
scalar.setVal(2, gray);
cvSet2D(mtx, i, j, scalar);
}
}
IplImage result = new IplImage(mtx);
cvSaveImage("manual_gray.png", result);
cvReleaseImage(image);
Not sure if creating a new CvMat
is the best approach, but it's the only way I know to work in javacv.
EDIT:
Unfortunately you use data types that are not from OpenCV, like PImage
, but I did my best to simulate what you are doing.
// Create a black image
IplImage imageDst = IplImage.create(imageSrc.width(), imageSrc.height(), IPL_DEPTH_8U, 3);
// Create a temporary mat to iterate over it's pixels
CvMat imagePixels = CvMat.createHeader(imageDst.height(), imageDst.width(), CV_32FC1);
// Copy black image to temporary mat
cvGetMat(imageDst, imagePixels, null, 0);
int x, y;
for(y=0; y