如何/为什么将图像数据存储为 char - OpenCV

2023-11-25

我有点困惑。

我刚刚开始使用 OpenCV,它的图像数据由字符指针指向。考虑到实际数据本身可以是任意数量的数据类型,例如,我无法完全弄清楚它是如何工作的。 uint、浮点数、双精度。据我所知,指针必须与其所代表的指针具有相同的类型。

可能值得注意的是,openCV 是一个 C 库,而我的背景是 C++,所以我不知道这些需要变量类型的问题在 C 中是如何解决的。

例如,以下来自 Learning OpenCV 的代码说明了我的困惑:

void saturate_sv( IplImage* img ) {
    for( int y=0; y<img->height; y++ ) {
    uchar* ptr = (uchar*) (
    img->imageData + y * img->widthStep
    );
       for( int x=0; x<img->width; x++ ) {
           ptr[3*x+1] = 255;
           ptr[3*x+2] = 255;
       }
    }
}

所以这有效,但是当我尝试对 IPL_DEPTH_64F 类型的 iplImage 进行操作并使用 ptr[3*x+1] = 1 时,结果不正确。因此,为了提炼我的​​问题:如何通过字符指针处理整数或浮点数据,特别是如何纠正上面的示例以处理双精度数据。

Thanks


  1. IPL_DEPTH_64F or doubleimages 将处理 0 - 1 之间的数据。
  2. 如果你习惯了 C++ 你应该看看OpenCV2.0它有几个 C++ 类,最重要的是,有一个类,即Mat处理图像、矩阵等

以下是有效访问图像中元素的简单方法:

IplImage* img = cvCreateImage(cvSize(300,300),IPL_DEPTH_64F,1);
for( int y=0; y<img->height; y++ ) 
    {
       double* ptr = reinterpret_cast<double*>(img->imageData + y * img->widthStep);
       for( int x=0; x<img->width; x++ ) 
       {
          ptr[x] = double(255);
       }
    }
cvNamedWindow("SO");
cvShowImage("SO",img);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&img);

由于您正在与double图像,更有意义的是:

  1. 与一个double指针,以便您可以轻松地分配一行中的元素ptr[x]
  2. 以字节为单位进行指针算术(img->imageData + y * img->widthStep)并将其投射到double pointer

还有,它是重要的您以字节为单位进行指针算术(或uchar, i.e. unsigned char) since OpenCV 倾向于填充图像的行为了提高效率而使用额外的字节(特别是对于double图片)。

所以即使一个double元素是 8 个字节,假设有 300 行,一行不能保证以 8*300 或 2400 字节结束,因为 OpenCV 可能会填充末尾。

因此,这可以防止您初始化指向图像第一个元素的指针,然后使用ptr[y*img->height+x]访问元素,因为每行可能有多个8*(y*img->height) bytes.

That's为什么示例代码每次使用都计算指向每一行的指针img->widthStep它代表每行的真实大小(以字节为单位)。

OpenCV 2.0

如果您使用Mat类中,你可以按照以下方式做同样的事情:

cv::Mat img(300,300,CV_64FC1);
for( int y=0; y<img.rows; y++ ) 
    {
       double* ptr = reinterpret_cast<double*>(img.data + y * img.step);
       for( int x=0; x<img.cols; x++ ) 
       {
          ptr[x] = double(255);
       } 
    }
cv::namedWindow("SO");
cv::imshow("SO",img);
cv::waitKey();

其中 img.step 是连续行之间的距离(以字节为单位)

如果你想直接访问元素(速度较慢):

img.at<double>(y,x)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何/为什么将图像数据存储为 char - OpenCV 的相关文章

随机推荐