错误 :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);
呵呵呵,姐哭着笑