IPL_DEPTH_64F
или double
изображения позаботятся о данных от 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
указателю
Кроме того, важно делать арифметику указателей в байтах (или uchar
, т.е. unsigned char
), поскольку OpenCV имеет тенденцию заполнять строки изображений дополнительными байт для эффективности (особенно для double
изображений).
Таким образом, даже если элемент double
имеет длину 8 байтов, а у вас, скажем, 300 строк, строка не обязательно заканчивается на 8 * 300 или 2400 байтах, поскольку OpenCV может дополнить конец.
Следовательно, это предотвращает инициализацию указателя на первый элемент изображения и последующее использование ptr[y*img->height+x]
для доступа к элементам, поскольку каждая строка может иметь более 8*(y*img->height)
байтов.
Это , поэтому пример кода вычисляет указатель на каждую строку каждый раз, используя 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)