0

我在我的 opencv 项目中联系了一个问题,即 cvCopy 函数没有正常行为!所以我写了这段代码来测试它。

int n = 6;
IplImage* img = cvCreateImage( cvSize(n,n) ,1 ,1 );
uchar* ptr = (uchar*)(img->imageData);

for(int i = 0 ; i< n*n ; i++)
{
    ptr[i] = i+1;
}

std::cout << "befor copy" << std::endl;
for( int i =0 ; i < n*n ;i++)   //print the imageData of img
{
    if ( i % n == 0 )
        std::cout<<std::endl;
    std::cout << std::setw(4) <<(int) ptr[i];
}

IplImage* img2 = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
cvCopy(img,img2);

ptr = (uchar*)(img2->imageData);
std::cout << "\nafter copy" << std::endl;
for( int i =0 ; i < n*n ;i++)    //print the imageData of img2
{
    if ( i % n == 0 )
        std::cout<<std::endl;
    std::cout << std::setw(4) <<(int) ptr[i];
}
std::cout<<std::endl;

输出是:

befor copy

 1   2   3   4   5   6    
 7   8   9  10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28  29  30
31  32  33  34  35  36
after copy

 1   2   3   4   5   6
 7   8   9  10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26   0   0   0   0
 0   0   0   0   0   0

所以,它只是复制到数字 26;不是所有的 imageData !
为什么 cvCopy 的行为是这样的?

4

1 回答 1

3

问题是:

IplImage* img = cvCreateImage( cvSize(n,n) ,1 ,1 );

您已将深度设置为1,但它应该类似于 IPL_DEPTH_8U。这里 depth=1 并不意味着 1 个字节,它是以位为单位的深度。您最好使用预定义值之一。例如

IplImage* img = cvCreateImage(cvSize(n, n), IPL_DEPTH_8U, 1);
于 2013-07-23T14:22:36.377 回答