-1
    cvCvtColor(img,dst,CV_RGB2YCrCb);
    for  (int col=0;col<dst->width;col++) 
    { 
        for (int row=0;row<dst->height;row++) 
        { 
            int idxF = row*dst->widthStep + dst->nChannels*col; // Read the image data 
            CvPoint pt = {row,col};
            temp_ptr2[0] += temp_ptr1[0]* 0.0722 + temp_ptr1[1] * 0.7152 +temp_ptr1[2] *0.2126  ;   // channel Y 
        }
    }

但结果是这样的:

在此处输入图像描述

请协助我哪里出错了?

4

1 回答 1

1

关于这个代码示例有很多话要说:

  • 首先,您使用的是旧的 C 样式 API(IplImage指针、cvBlah函数等),它已过时且更难维护(特别是容易引入内存泄漏),因此您应该考虑使用 C++ 样式的结构和函数(cv::Mat结构和cv::blah功能)。

  • 您的错误可能来自cvCopy(dst,img);一开始的说明。这会在您开始处理之前填充您的输入图像,因此您应该删除此行。

  • 为了获得最大速度,您应该反转两个循环,以便您首先遍历行然后遍历列。这是因为 OpenCV 中的图像是逐行存储在内存中的,因此通过增加列来访问图像对于缓存的使用来说更有效。

  • 临时变量idxF从不使用,因此您可能也应该删除以下行:

    int idxF = row*dst->widthStep + dst->nChannels*col;
    
  • 当您访问图像数据以将像素存储在temp_ptr1和中temp_ptr2时,您交换了xy坐标的位置。您应该通过以下方式访问图像:

    temp_ptr1  = &((uchar*)(img->imageData + (img->widthStep*pt.y)))[pt.x*3];
    
  • 您永远不会释放为 分配的内存dst,因此会在您的应用程序中引入内存泄漏。cvReleaseImage(&dst);在函数结束时调用。

于 2014-03-01T13:42:24.397 回答