在类 cv::Mat 中,图像数据以 unsigned char 形式保存在一块内存中。这块内存的首地址可以通过data成员变量得到。data是一个 unsigned char 型的指针,所以循环图像数据可以以如下方式开始:
uchar *data=image.data;
从当前行到下一行可以通过对指针加上 行宽 完成:
data+=image.step; //下一行
step代表图像的行宽(包括填补像素),所以可以通过如下方式获得第j行第i列的像素的地址:
data=image.data+j*image.step+i*image.elemSize(); //(j,i)处的像素地址为&image.at(j,i)
正因为如此,可以按引用调用函数。
int Detect(unsigned char *pImage, int nImgWidth, int nImgHeight, int* pFaceNum);
调用时第一个参数可以是:
Mat frame;
Detect(frame.data, frame.cols, frame.rows, pFaceNum);
got it