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
}
}
但结果如下:
请协助我哪里出错?
答案 0 :(得分: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
中的像素时,您交换了x
和y
坐标的位置。您应该按以下方式访问图像:
temp_ptr1 = &((uchar*)(img->imageData + (img->widthStep*pt.y)))[pt.x*3];
您永远不会释放为dst
分配的内存,因此会在您的应用程序中引入内存泄漏。在功能结束时致电cvReleaseImage(&dst);
。