当我想将IpLmage转换为mat、opencv时,我遇到了一些错误

I met some errors when I want to convert IpLmage to mat, opencv

本文关键字:遇到 错误 opencv IpLmage 转换 mat      更新时间:2023-10-16
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,我尝试了很多方法,但我总是遇到断言失败或其他问题,我认为这可能是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);

我对此很陌生,有人能帮我吗?非常感谢!

实际上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);

带有对目的地的引用(&(。