【问题标题】:OpenCV cvSet2d.....what does this doOpenCV cvSet2d .....这是做什么的
【发布时间】:2010-11-17 16:03:11
【问题描述】:

在访问像素数据时,我正在浏览 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 到底在做什么?是否将其设置为黑色?........我不明白它应该是什么?

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

谢谢

【问题讨论】:

    标签: c++ image-processing opencv


    【解决方案1】:

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

    您尝试using pointers to access data within an image而不是使用 cvGet/Set 函数吗?

    【讨论】:

    • 好点,但我会声称 i 不一定被定义为代表 X 轴..
    • 这就是您在该像素处设置的值 - 您在点 (j,一)
    【解决方案2】:

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

    // 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多