Увеличение яркости не дает желаемого эффекта

    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); в конце вашей функции.

Другие вопросы по тегам