void LBP(Mat src, IplImage* dst)
{
int tmp[8] = { 0 };
CvScalar s;
Mat temp = Mat(src.size(), IPL_DEPTH_8U, 1);
uchar *data = (uchar*)src.data;
int step = src.step;
//cout << "step" << step << endl;
for (int i = 1; i<src.size().height - 1; i++)
for (int j = 1; j<src.size().width - 1; j++)
{
int sum = 0;
if (data[(i - 1)*step + j - 1]>data[i*step + j])
tmp[0] = 1;
else
tmp[0] = 0;
if (data[i*step + (j - 1)]>data[i*step + j])
tmp[1] = 1;
else
tmp[1] = 0;
if (data[(i + 1)*step + (j - 1)]>data[i*step + j])
tmp[2] = 1;
else
tmp[2] = 0;
if (data[(i + 1)*step + j]>data[i*step + j])
tmp[3] = 1;
else
tmp[3] = 0;
if (data[(i + 1)*step + (j + 1)]>data[i*step + j])
tmp[4] = 1;
else
tmp[4] = 0;
if (data[i*step + (j + 1)]>data[i*step + j])
tmp[5] = 1;
else
tmp[5] = 0;
if (data[(i - 1)*step + (j + 1)]>data[i*step + j])
tmp[6] = 1;
else
tmp[6] = 0;
if (data[(i - 1)*step + j]>data[i*step + j])
tmp[7] = 1;
else
tmp[7] = 0;
s.val[0] = (tmp[0] * 1 + tmp[1] * 2 + tmp[2] * 4 + tmp[3] * 8 + tmp[4] * 16 + tmp[5] * 32 + tmp[6] * 64 + tmp[7] * 128);
cvSet2D(dst, i, j, s);
}
}
上面是我本地二进制模式的原始代码,src是输入矩阵,dst是输出。现在我想将void LBP(Mat src,IplImage * dst)中的IPLimage更改为void LBP(Mat src,mat dst),我尝试了很多方法,但我总是遇到断言失败或其他问题,我认为它可能是cvSet2D的问题(dst,i,j,s);
这是输入src的定义:
Mat Gray_face = Mat(image.size(), image.depth(), 1);
这是我对输出dst的定义:
IplImage* lbp_face = cvCreateImage(Gray_face.size(), IPL_DEPTH_8U, 1);
我想把它改成垫子,让它适用于我的程序。
这就是我称之为LBP功能的方式:
LBP(Gray_face, lbp_face);
我对此很陌生,任何人都可以帮助我吗?非常感谢你!
答案 0 :(得分:1)
确实cvSet2D是旧界面。要将点设置为cv :: Mat dst,可以使用at()。 Fisrt,你首先(重新)将其分配为:
dst.create(src.size(),CV_8U);
然后在你的案例中设置一个值点:
dst.at<char>(i,j) = (tmp[0] * 1 + tmp[1] * 2 + tmp[2] * 4 + tmp[3] * 8 + tmp[4] * 16 + tmp[5] * 32 + tmp[6] * 64 + tmp[7] * 128);
最后但并非最不重要的是,如果要返回结果,则函数定义应为:
void LBP(Mat src, Mat & dst);
带有到目的地的参考号(&amp;)。