opencv cvcopy() error :assertion faild (src.depth()==dst.depth()&&src.size==dst.size)

错误 :opencv cvcopy() error :assertion faild (src.depth()==dst.depth()&&src.size==dst.size)

意思是原和目的的depth或者mat大小不一样

分析: 

我查了好多资料,大体总结如下:

1、这两个图或者矩阵是否初始化了,初始化的大小是否相同

2、这两者的depth是否一样,是不是通道不同,是不是通道相同但位数不同

3、是不是在cvcopy()前用了cvSetImageROI(),如果用了,这就有可能因为在cvSetImageROI()前的原图深度和位数不一样而没有产生作用。故在cvcopy()造成src.size!=dst.size,进而出错。


我仔细检查了自己的代码,发现我的是第3种错误,真是隐藏的够深的呀,让我好生难找呀。故奉上代码如下:

解决:

需要用到如下4个函数:

1、void check_IplImage_widthStep_align(IplImage *image, int n_bytes_row)
{
    if (image->widthStep != n_bytes_row)
        ABORT("Expected image->widthStep = %i, but image->widthStep = %i.\n", n_bytes_row, image->widthStep);


    image->align = 666;
}

2、IplImage *create_IplImage_32F_from_float_data(int n_x, int n_y, float *data)
{
    IplImage *image = cvCreateImageHeader(cvSize(n_x, n_y), IPL_DEPTH_32F, 1);
    image->origin = IPL_ORIGIN_BL;


    int n_bytes_row = n_x * sizeof(float);
    cvSetData(image, data, n_bytes_row);
    
    check_IplImage_widthStep_align(image, n_bytes_row);


    return image;
}


3、IplImage *create_IplImage_64F_from_double_data(int n_x, int n_y, double *data)
{
    IplImage *image = cvCreateImageHeader(cvSize(n_x, n_y), IPL_DEPTH_64F, 1);
    image->origin = IPL_ORIGIN_BL;


    int n_bytes_row = n_x * sizeof(double);
    cvSetData(image, data, n_bytes_row);
    
    check_IplImage_widthStep_align(image, n_bytes_row);


    return image;
}

4、IplImage *create_IplImage_from_float_data_copy_malloc(int n_x, int n_y, float *data, int ipl_depth)
{
    IplImage *image = NULL;


    switch (ipl_depth)
    {
        case IPL_DEPTH_32F:
        {
            int n_bytes = n_x * n_y * sizeof(float);
            float *data_copy = (float *) malloc(n_bytes);
            if (data_copy == NULL)
               printf("Cannot acquire memory for float *data_copy.\n");// ABORT("Cannot acquire memory for float *data_copy.\n");


            memcpy(data_copy, data, n_bytes);


            image = create_IplImage_32F_from_float_data(n_x, n_y, data_copy);


            break;
        }
        case IPL_DEPTH_64F:
        {
            int n_elems = n_x * n_y;
            int n_bytes = n_elems * sizeof(double);
            double *data_copy = (double *) malloc(n_bytes);
            if (data_copy == NULL)
                printf("Cannot acquire memory for double *data_copy.\n");//ABORT("Cannot acquire memory for double *data_copy.\n");
           int i=0;
            for (i = 0; i < n_elems; ++i)
                data_copy[i] = (double) data[i];


            image = create_IplImage_64F_from_double_data(n_x, n_y, data_copy);


            break;
        }

       default:
            printf("Unrecognized IPL depth, ipl_depth = %i.\n", ipl_depth);//ABORT("Unrecognized IPL depth, ipl_depth = %i.\n", ipl_depth);
    }


    return image;
}

最后的调用代码:

IplImage *projection_org = create_IplImage_from_float_data_copy_malloc( n_x, n_y, data, IPL_DEPTH_64F);

CvRect projection_pad_center_ROI = cvRect(row_pad / 2, col_pad / 2, prj.X,prj.Y);
 cvSetImageROI(projection_org, cvRect(0, 0, prj.X, prj.Y));
cvSetImageROI(projection, projection_pad_center_ROI); // NOTE: The extents of this ROI are the same as image0's ROI.
 cvCopy(projection_org, projection, NULL);
 cvResetImageROI(projection_org);
cvResetImageROI(projection);

呵呵呵,姐哭着笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值