Это ваш вызов cvSetImageData. Когда вы вызываете cvCreateImage, он выделяет как заголовок, так и данные изображения. cvCreateImageHeader выделяет только заголовок изображения.
Когда вы вызываете cvSetImageData, он НЕ копирует данные в структуру. Скорее он просто устанавливает указатель так, чтобы он указывал на любые данные, которые вы указали. Поэтому, если вы вызываете cvCreateImage, а затем cvSetImageData, данные изображения, выделенные cvCreateImage, теряются.
Довольно неприятный побочный эффект того, как вы это делаете, заключается в том, что пользователь потенциально может вызвать cvReleaseImage, который фактически попытается освободить данные в [rep bitmapData]. Гораздо лучшим способом было бы просто вызвать cvCreateImage, а затем скопировать в него все данные из [rep bitmapData].
Надеюсь, это поможет.