opencv +cvcopy:Assertion Failure (dst.depth==src.depth&&dst.size==src.size).....

freeboy1015 2012-02-22 08:23:03
代码中有两处用到了cvCopy,一处是将小图copy到大图的ROI,一处是将大图的ROI copy到小图(即获取子图),每次我都有setROI和resetROI,两种用法在程序中都被多次循环使用,例如:20次。下面这个bug会在随机的次数中出现,有时在第4次出现,有时在第17次出现,很随机。是什么问题,望大牛帮帮忙!谢谢了!!!


bug如下两图:



...全文
370 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
没有昵称阿 2012-02-23
  • 打赏
  • 举报
回复
int t_m=J->width;
int t_n=J->height;
应该互换一下,m->height->rows;n->width->cols;

m,n
height,width
rows,cols
的对应关系一定不能搞错。
freeboy1015 2012-02-22
  • 打赏
  • 举报
回复
以下是用到cvCopy()的函数和代码,麻烦大家在这些代码中帮忙找出问题所在。


//函数功能:前或后镜像addrows行addcols列。
void padarray(IplImage* J,IplImage* dst,int addrows,int addcols,int direction)//dierction:1pre,2post,3both
{
CvSize size=cvSize(J->width,J->height);
CvRect roi=cvRect( 0, 0, 0, 0 );

switch (direction)
{
case 1:
size=cvSize(J->width+addcols,J->height+addrows) ;
roi=cvRect( addcols, addrows, J->width,J->height );//rectd的x,y坐标就是常规的坐标系,跟图像的坐标系不一样。
break;
case 2:
size=cvSize(J->width+addcols,J->height+addrows) ;
roi=cvRect( 0, 0, J->width,J->height );
break;
default://"both"
size=cvSize(J->width+2*addcols,J->height+2*addrows) ;
roi=cvRect( addcols,addrows , J->width,J->height );
}

//IplImage* dst=cvCreateImage(size,J->depth,J->nChannels);

cvSetImageROI(dst,roi);
cvCopy(J,dst);/////////////////////////////////////////问题在这里??????
cvResetImageROI(dst);

if(direction==1)
{
for(int i=0;i<addrows;i++)//先镜像行
{
for (int j=addcols;j<size.width;j++)
{
int newi=addrows-1+addrows-i;
if(newi<size.height)
{
cvSet2D(dst,i,j,cvGet2D(dst,newi,j));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,size.height-1,j));
}
}
}

for(int j=0;j<addcols;j++)//再镜像列
{
for (int i=0;i<size.height;i++)
{
int newj=addcols-1+addcols-j;
if(newj<size.width)
{
cvSet2D(dst,i,j,cvGet2D(dst,i,newj));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,i,size.width-1));
}
}
}
}
else if (direction==2)
{
for(int i=J->height;i<size.height;i++)//先镜像行
{
for (int j=0;j<J->width;j++)
{
int newi=J->height-1-(i-J->height);
if(newi>0)
{
cvSet2D(dst,i,j,cvGet2D(dst,newi,j));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,0,j));
}
}
}

for(int j=J->width;j<size.width;j++)//再镜像列
{
for (int i=0;i<size.height;i++)
{
int newj=J->width-1-(j-J->width);
if(newj>0)
{
cvSet2D(dst,i,j,cvGet2D(dst,i,newj));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,i,0));
}
}
}
}
//"both"就不写了,没用到。
//return dst;
}





//函数功能:算出两幅图像中选中的beesites点的互信息,结果返回给vals矩阵。
void EvalMI(IplImage *image1,IplImage *image2,CvMat* beeSites,string EvMethod,CvMat* vals)
{
int m=image1->height;
int n=image1->width;

for (int i = 0;i<beeSites->rows;i++)
{
double thetas = CV_MAT_ELEM(*beeSites,double,i,0);//Get angle theta every row
double cols = CV_MAT_ELEM(*beeSites,double,i,1); //Get col(x-coordinate) theta every row
double rows = CV_MAT_ELEM(*beeSites,double,i,2); //Get row(y-coordinate) theta every row
double ss1 = CV_MAT_ELEM(*beeSites,double,i,3); //Get scale every row
double ss2 = CV_MAT_ELEM(*beeSites,double,i,4); //Get scale every row
double ss3 = CV_MAT_ELEM(*beeSites,double,i,5); //Get scale every row
double ss4 = CV_MAT_ELEM(*beeSites,double,i,6); //Get scale every row
double sp1 = CV_MAT_ELEM(*beeSites,double,i,7); //Get project scale 1.
double sp2 = CV_MAT_ELEM(*beeSites,double,i,8); //Get project scale 2.

double matM[3][3]={ ss1*cos(thetas), ss2*sin(thetas), cols,
-ss3*sin(thetas), ss4*cos(thetas), rows,
sp1, sp2, 1};
CvMat M = cvMat(3,3,CV_64FC1,matM); //求得的是image2-->image1的M。

MoveandSize MS=cvGetImgJSize(&M,image2);
CV_MAT_ELEM(M,double,0,2)=MS.xmove;
CV_MAT_ELEM(M,double,1,2)=MS.ymove;

//IplImage *J=cvCreateImage(cvSize(image1->width,image1->height),image1->depth,image1->nChannels);
//cvWarpPerspective(image2,J,&M,CV_INTER_LINEAR+(CV_WARP_INVERSE_MAP),cvScalarAll(0)); //将image2利用M变换回image1的角度,以供求互信息.
//double tV=MI2(J,image1,"Normalized");

IplImage *J=cvCreateImage(MS.size,image2->depth,image2->nChannels);
cvWarpPerspective(image2,J,&M,CV_INTER_LINEAR+(CV_WARP_FILL_OUTLIERS),cvScalarAll(0)); //向前变换,由image2-->image1(即subJ)。

int t_m=J->width;
int t_n=J->height;
int t_dm=abs(t_m-m);
int t_dn=abs(t_n-n);

IplImage *J1= cvCreateImage(cvSize(J->width+n/2,J->height+m/2),J->depth,J->nChannels);
padarray(J,J1,m/2,n/2,1); /////////////////////////////////////////问题在这里??????

IplImage *J2= cvCreateImage(cvSize(J1->width+n/2+t_dn,J1->height+m/2+t_dm),J1->depth,J1->nChannels);
padarray(J1,J2,m/2+t_dm,n/2+t_dn,2);/////////////////////////////////////////问题在这里??????

cols=cvRound(cols);
rows=cvRound(rows);

//subJ = J2(rows:(rows+m-1),cols:(cols+n-1));
IplImage *subJ=cvCreateImage(cvSize(m,n),J2->depth,J2->nChannels);
CvRect roi=cvRect( cols, rows, m, n );//不可能会越界。
cvSetImageROI(J2,roi);
cvCopy(J2,subJ);/////////////////////////////////////////问题在这里??????
cvResetImageROI(J2);

double tV=MI2(subJ,image1,"Normalized");

CV_MAT_ELEM(*vals,double,i,0)=tV;

cvReleaseImage(&J);
cvReleaseImage(&J1);
cvReleaseImage(&J2);
cvReleaseImage(&subJ);
}
}



EvalMI函数会被主函数多次循环调用
freeboy1015 2012-02-22
  • 打赏
  • 举报
回复
以下是用到cvCopy()的函数和代码,麻烦大家在这些代码中帮忙找出问题所在。


//函数功能:前或后镜像addrows行addcols列。
void padarray(IplImage* J,IplImage* dst,int addrows,int addcols,int direction)//dierction:1pre,2post,3both
{
CvSize size=cvSize(J->width,J->height);
CvRect roi=cvRect( 0, 0, 0, 0 );

switch (direction)
{
case 1:
size=cvSize(J->width+addcols,J->height+addrows) ;
roi=cvRect( addcols, addrows, J->width,J->height );//rectd的x,y坐标就是常规的坐标系,跟图像的坐标系不一样。
break;
case 2:
size=cvSize(J->width+addcols,J->height+addrows) ;
roi=cvRect( 0, 0, J->width,J->height );
break;
default://"both"
size=cvSize(J->width+2*addcols,J->height+2*addrows) ;
roi=cvRect( addcols,addrows , J->width,J->height );
}

//IplImage* dst=cvCreateImage(size,J->depth,J->nChannels);

cvSetImageROI(dst,roi);
cvCopy(J,dst);
cvResetImageROI(dst);

if(direction==1)
{
for(int i=0;i<addrows;i++)//先镜像行
{
for (int j=addcols;j<size.width;j++)
{
int newi=addrows-1+addrows-i;
if(newi<size.height)
{
cvSet2D(dst,i,j,cvGet2D(dst,newi,j));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,size.height-1,j));
}
}
}

for(int j=0;j<addcols;j++)//再镜像列
{
for (int i=0;i<size.height;i++)
{
int newj=addcols-1+addcols-j;
if(newj<size.width)
{
cvSet2D(dst,i,j,cvGet2D(dst,i,newj));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,i,size.width-1));
}
}
}
}
else if (direction==2)
{
for(int i=J->height;i<size.height;i++)//先镜像行
{
for (int j=0;j<J->width;j++)
{
int newi=J->height-1-(i-J->height);
if(newi>0)
{
cvSet2D(dst,i,j,cvGet2D(dst,newi,j));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,0,j));
}
}
}

for(int j=J->width;j<size.width;j++)//再镜像列
{
for (int i=0;i<size.height;i++)
{
int newj=J->width-1-(j-J->width);
if(newj>0)
{
cvSet2D(dst,i,j,cvGet2D(dst,i,newj));
}
else
{
cvSet2D(dst,i,j,cvGet2D(dst,i,0));
}
}
}
}
//"both"就不写了,没用到。
//return dst;
}





//函数功能:算出两幅图像中选中的beesites点的互信息,结果返回给vals矩阵。
void EvalMI(IplImage *image1,IplImage *image2,CvMat* beeSites,string EvMethod,CvMat* vals)
{
int m=image1->height;
int n=image1->width;

for (int i = 0;i<beeSites->rows;i++)
{
double thetas = CV_MAT_ELEM(*beeSites,double,i,0);//Get angle theta every row
double cols = CV_MAT_ELEM(*beeSites,double,i,1); //Get col(x-coordinate) theta every row
double rows = CV_MAT_ELEM(*beeSites,double,i,2); //Get row(y-coordinate) theta every row
double ss1 = CV_MAT_ELEM(*beeSites,double,i,3); //Get scale every row
double ss2 = CV_MAT_ELEM(*beeSites,double,i,4); //Get scale every row
double ss3 = CV_MAT_ELEM(*beeSites,double,i,5); //Get scale every row
double ss4 = CV_MAT_ELEM(*beeSites,double,i,6); //Get scale every row
double sp1 = CV_MAT_ELEM(*beeSites,double,i,7); //Get project scale 1.
double sp2 = CV_MAT_ELEM(*beeSites,double,i,8); //Get project scale 2.

double matM[3][3]={ ss1*cos(thetas), ss2*sin(thetas), cols,
-ss3*sin(thetas), ss4*cos(thetas), rows,
sp1, sp2, 1};
CvMat M = cvMat(3,3,CV_64FC1,matM); //求得的是image2-->image1的M。

MoveandSize MS=cvGetImgJSize(&M,image2);
CV_MAT_ELEM(M,double,0,2)=MS.xmove;
CV_MAT_ELEM(M,double,1,2)=MS.ymove;

//IplImage *J=cvCreateImage(cvSize(image1->width,image1->height),image1->depth,image1->nChannels);
//cvWarpPerspective(image2,J,&M,CV_INTER_LINEAR+(CV_WARP_INVERSE_MAP),cvScalarAll(0)); //将image2利用M变换回image1的角度,以供求互信息.
//double tV=MI2(J,image1,"Normalized");

IplImage *J=cvCreateImage(MS.size,image2->depth,image2->nChannels);
cvWarpPerspective(image2,J,&M,CV_INTER_LINEAR+(CV_WARP_FILL_OUTLIERS),cvScalarAll(0)); //向前变换,由image2-->image1(即subJ)。

int t_m=J->width;
int t_n=J->height;
int t_dm=abs(t_m-m);
int t_dn=abs(t_n-n);

IplImage *J1= cvCreateImage(cvSize(J->width+n/2,J->height+m/2),J->depth,J->nChannels);
padarray(J,J1,m/2,n/2,1);

IplImage *J2= cvCreateImage(cvSize(J1->width+n/2+t_dn,J1->height+m/2+t_dm),J1->depth,J1->nChannels);
padarray(J1,J2,m/2+t_dm,n/2+t_dn,2);

cols=cvRound(cols);
rows=cvRound(rows);

//subJ = J2(rows:(rows+m-1),cols:(cols+n-1));
IplImage *subJ=cvCreateImage(cvSize(m,n),J2->depth,J2->nChannels);
CvRect roi=cvRect( cols, rows, m, n );//不可能会越界。
cvSetImageROI(J2,roi);
cvCopy(J2,subJ);////////////////////////////问题在这里??????
cvResetImageROI(J2);

double tV=MI2(subJ,image1,"Normalized");

CV_MAT_ELEM(*vals,double,i,0)=tV;

cvReleaseImage(&J);
cvReleaseImage(&J1);
cvReleaseImage(&J2);
cvReleaseImage(&subJ);
}
}



EvalMI函数会被主函数多次循环调用。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧