Увеличение яркости не дает желаемого эффекта
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
}
}
Но результат таков:
Пожалуйста, помогите, где я иду не так?
1 ответ
Об этом примере кода можно многое сказать:
Во-первых, вы используете старый API в стиле C (
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);
в конце вашей функции.