我有一张图片,cv::Mat
。我从这里得到原始数据:
uchar* data = (uchar *)pImg.data;
我需要将此数据传递给函数,然后循环遍历图像的每个像素。我会做的:
for (int i = 0; i < image.rows; ++i)
{
for (int j = 0; j < image.cols; ++j)
{
//pixel = cv::Point(i,j);
}
}
使用uchar*
数据?
答案 0 :(得分:2)
这很简单,但你需要记住一件事,这个image.elemSize()
表示每个像素有多少字节(这个函数取自OpenCV mat)。因此,对于不同的图像格式,此循环看起来会略有不同。循环中有一个例子
for (auto i = 0; i < image.rows * image.cols; i+=image.elemSize()) { //for CV_8UC1 //auto pixel = *(image.data + i) //for RGB as CV_8UC3 auto r = *(image.data + i) auto g = *(image.data + i + 1) auto b = *(image.data + i + 2) }
答案 1 :(得分:2)
如果已知以下参数,则可以从原始数据访问正确的像素值:
uchar
,ushort
,float
等)鉴于以上信息,可以按如下方式访问像素(对于CV_8UC3
类型):
uchar* data = (uchar *)pImg.data;
for (int i = 0; i < image.rows; ++i)
{
for (int j = 0; j < image.cols; ++j)
{
uchar b = data[i * pImg.step + pImg.channels() * j + 0];
uchar g = data[i * pImg.step + pImg.channels() * j + 1];
uchar r = data[i * pImg.step + pImg.channels() * j + 2];
}
}