Сколько каналов в изображении вы работаете? Это важная информация. Имейте в виду, что изображения в градациях серого обычно имеют 1 канал, а цветные изображения, загружаемые OpenCV, обычно имеют 3 канала (R, G и B).
Для работы с 3-канальным изображением в C, вы можете сделать:
IplImage* pRGBImg = cvLoadImage("img.png", CV_LOAD_IMAGE_UNCHANGED);
int width = pRGBImg->width;
int height = pRGBImg->height;
int bpp = pRGBImg->nChannels;
for (int i=0; i < width*height*bpp; i+=bpp)
{
pRGBImg->imageData[i] = r; // RED pixel
pRGBImg->imageData[i+1] = g; // GREEN
pRGBImg->imageData[i+2] = b; // BLUE
}
Для одноканальных изображений ядро цикла будет намного проще, так как вам нужно будет работать только на img->imageData[i]
.