我在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会这样?

最佳答案

该探针具有:

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

您已经将深度设置为1,但是应该类似于IPL_DEPTH_8U。
这里depth = 1并不意味着1个字节,而是以位为单位的深度。您最好使用predefined values之一。例如。
IplImage* img = cvCreateImage(cvSize(n, n), IPL_DEPTH_8U, 1);

关于c++ - 为什么cvCopy不会复制整个imageData?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17812544/

10-11 16:17