OpenCV cvSet2d .....这是做什么的

时间:2010-11-17 16:03:12

标签: c++ image-processing opencv

在访问Pixel Data时,我正在浏览OpenCV页面中的一些代码

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);
s.val[0]=111;
s.val[1]=111;
s.val[2]=111;
cvSet2D(img,i,j,s); // set the (i,j) pixel value

我做过类似的事情,但我使用提供的模板类来访问像素数据......反正我不确定我理解部分s.val [0] = 111 ....等? 如果s.val [0]包含B值,那么s.val [0] = 111到底在做什么?是不是把它设置为黑色?........我不明白它到底应该是什么?

我习惯了CVscalars等,但我不明白这种格式?具体是什么意思?

感谢

2 个答案:

答案 0 :(得分:5)

cvSet2D(img,i,j,s)用于不访问第(i,j)个像素。它访问第(j,i)个像素。这是因为图像存储为矩阵 - 您需要先指定行(Y坐标),然后指定列(X坐标)。

您没有使用cvGet / Set功能,而是尝试using pointers to access data within an image

答案 1 :(得分:0)

如果您想直接访问像素,请在加载图片后执行以下操作:

// This example converts a colored image to its grayscale version.
// Let's say that rgb_img is your previously loaded image.
IplImage* gray_frame = 0;
gray_frame = cvCreateImage(cvSize(rgb_img->width, rgb_img->height), rgb_img->depth, rgb_img->nChannels);
if (!gray_frame)
{
  fprintf(stderr, "!!! cvCreateImage failed!\n" );
  return NULL;
}

for (int i = 0; i < rgb_img->width * rgb_img->height * rgb_img->nChannels; i += rgb_img->nChannels)
{
    gray_frame->imageData[i] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3;   //B
    gray_frame->imageData[i+1] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //G
    gray_frame->imageData[i+2] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //R
}