cv::Mat
предпочтительнее, чем IplImage
, потому что это упрощает ваш код
cv::Mat img = cv::imread("lenna.png");
for(int i=0; i<img.rows; i++)
for(int j=0; j<img.cols; j++)
// You can now access the pixel value with cv::Vec3b
std::cout << img.at<cv::Vec3b>(i,j)[0] << " " << img.at<cv::Vec3b>(i,j)[1] << " " << img.at<cv::Vec3b>(i,j)[2] << std::endl;
Это предполагает, что вам нужно использовать значения RGB вместе. Если вы этого не сделаете, вы можете использовать cv :: split для получения каждого канала отдельно. См. Ответ etarion по ссылке с примером.
Кроме того, в моих случаях вам просто нужно изображение в оттенках серого. Затем вы можете загрузить изображение в градациях серого и получить к нему доступ в виде массива uchar.
cv::Mat img = cv::imread("lenna.png",0);
for(int i=0; i<img.rows; i++)
for(int j=0; j<img.cols; j++)
std::cout << img.at<uchar>(i,j) << std::endl;
ОБНОВЛЕНИЕ : Использование разделения для получения 3 каналов
cv::Mat img = cv::imread("lenna.png");
std::vector<cv::Mat> three_channels = cv::split(img);
// Now I can access each channel separately
for(int i=0; i<img.rows; i++)
for(int j=0; j<img.cols; j++)
std::cout << three_channels[0].at<uchar>(i,j) << " " << three_channels[1].at<uchar>(i,j) << " " << three_channels[2].at<uchar>(i,j) << std::endl;
// Similarly for the other two channels
ОБНОВЛЕНИЕ: Спасибо entarion за обнаружение ошибки, которую я представил при копировании и вставке из примера cv :: Vec3b.