cvCopy.cpp error:src.depth() == dst.depth() && src.size() == dst.size()...

錯誤起因:在調用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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章