c - cvGet2D 和 cvSet2D 的用途?

标签 c opencv image-processing

cvSet2DcvGet2D 在 OpenCV 中实际上做了什么?就像下面旋转矩阵的代码一样,我使用的是 cvGet2D:

    CvMat* rot3= cv2DRotationMatrix( center, angle, scale, rot);
    cv::Mat rot3cpp(rot3);
    for(int j=0;j<rot3cpp.rows;j++)
    {
    for (int i=0;i<rot3cpp.cols;i++)
      {
        CvScalar scal = cvGet2D(rot3,j,i);

        printf("new matrix is %f: \n", rot3cpp.at<float>(j,i));
      }
    }

如果我添加以下行,cvSet2D 的使用将如何更改我的代码:

  cvSet2D(rot3,i,j,scal); // set the (i,j) pixel value

在打印值之前? “设置(i,j)像素值”是什么意思?

最佳答案

简答: cvGet2D()cvSet2D()分别用于获取和设置二维矩阵或图像的元素。

长答案:

假设您创建了一个CvMat m:

CvMat* m = cvCreateMat(3, 3, CV_32FC1);
float data[9] = {0, 1, 2, 3,  4, 5, 6, 7, 8};
cvSetData(m, data, m->step);

这将创建一个如下所示的矩阵:

[0.0 1.0 2.0]
[3.0 4.0 5.0]
[6.0 7.0 8.0]

如果要获取包含值2.0的元素,可以使用cvGet2D()获取第一行第三列的元素:

CvScalar scal = cvGet2D(m, 0, 2);    // Rows and columns are zero-indexed

但由于这只是一个单 channel 矩阵,因此只有 scal 的第一个元素包含有意义的数据。

double value = scal.data[0];    // Voila! value == 2.0

但是现在如果您想更改该元素的值怎么办?然后你会使用cvSet2D():

CvScalar new_value = cvScalar(9.0);
cvSet2D(m, 0, 2, new_value);

然后,m 中的数据如下所示:

[0.0 1.0 9.0] <-- note the change
[3.0 4.0 5.0]
[6.0 7.0 8.0]

关于c - cvGet2D 和 cvSet2D 的用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612552/

相关文章:

c - 内联汇编中的 Jknzd,编译错误

c - 为什么递归函数的输出为0?

c - 逐个元素读取有效,但读取 block 则无效

c++ - 如何确定 OpenCV 版本

opencv - 如何在不使用 opencv 中的 fitEllipse() 的情况下检测图像中的椭圆?

c - 为什么我的C程序无法运行?

python - 将像素强度范围从 [0,255] 更改为 [0,1]

opencv - Delphi opencv ocvFFMpegIPCamSource 到位图?

c++ - 如何在 OpenCV 中将 8 位 IplImage 转换为 24 位 IplImage?

c - RGB565 转灰度