-
IPL_DEPTH_64F
or double
images 将处理 0 - 1 之间的数据。
- 如果你习惯了 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
图像,更有意义的是:
- 与一个
double
指针,以便您可以轻松地分配一行中的元素ptr[x]
- 以字节为单位进行指针算术(
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)