錯誤起因:在調用cvSetImageROI後,使用cvCopy出現錯誤,導致程序異常終止。
原因分析:cvSetImageROI()這個函數不一定執行成功,可能導致src與dst的depth或者size不匹配造成cvCopy報錯。
解決方法:在調用cvCopy前判斷一下src與dst的depth和size,看是否匹配。
cvSetImageROI函數原型:
void cvSetImageROI(IplImage* image, CvRect rect)
設置圖像的ROI(感興趣區域),如果指定的CvRect區域超出image已有的區域,則超出部分忽略;如image大小爲(100,100),而指定的CvRect爲(50,50,100,100),則image->roi的大小爲(50,50),而不是指定的(100,100)。如果指定的CvRect都不在已有區域內,那就等着Assertion failed吧。
cvCopy函數原型:
void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL)
如果傳入的參數是IplImage類型,則使用其ROI或COI,而不是原IplImage整個圖像,注意src與dst的類型、大小以及深度等等因素都要相等,否則會報錯。
測試Demo:
int main()
{
IplImage *src, *dst;
src = cvLoadImage("test1.jpg");
dst = cvCreateImage(cvSize(100,100),8,3);
cvSetImageROI(src, cvRect(50,50,100,100));
cout << src->roi->width << "-" << src->roi->height << endl;
cvCopy(src, dst);
cvResetImageROI(src);
//創建窗口
cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
cvShowImage("src",src);
cvShowImage("dst",dst);
waitKey(0);
cvDestroyWindow("src");
cvDestroyWindow("dst");
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
}