Я работаю на Win7 x64, с openCV и Visual Studio 2010, программирую на c ++.
Я хочу скопировать изображение (назовите это образ) в прямоугольную область другого изображения (назовите его RR_image). Эта область, однако, вращается.
здесь образ:
и вот RR_image:
(как вы видите, я уже повернул первое изображение)
Я бы скопировал первое изображение в красный прямоугольник.
Сколько и как можно это сделать?
Я знаю о ROI и: img1.copyTo(img2.rowRange(...), img2.colRange(...));
Спасибо!
Основная проблема заключается в том, что OpenCV не поддерживает прозрачность в изображениях, что вам нужно, чтобы выполнить эту задачу простым способом.
Таким образом, один из способов сделать это — написать собственную функцию / метод для перебора повернутого (исходного) изображения, копируя пиксели в целевое изображение, игнорируя при этом пиксели фона (например, определенный оттенок серого). Однако этот подход очень ограничен.
РЕДАКТИРОВАТЬ:
OpenGL, безусловно, может справиться с этой задачей, но он несет в себе сложность, о которой вы, вероятно, не хотите, чтобы вы знали. К счастью, есть и другие альтернативы, такие как ImakeMagick, который предоставляет API C ++ через ImageMagick ++ и он, безусловно, может обрабатывать прозрачные изображения. Взгляни на Нежное Введение в Магию ++.
Я решил свою проблему с библиотекой Qt и OpenCV.
Вот как:
Дано образ а также RR_image чтобы скопировать первое в второе, я использовал этот код:
QPainter painter(&RR_image);
painter.drawImage( (float)p1.x(),(float)p2.y(), image);
RR_image а также образ должен быть объектом QImage, поэтому я должен преобразовать их из Mat в QImage с помощью этого кода:
cvtColor(image, image,CV_BGR2RGB);
QImage image= QImage((uchar*) image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
Результат:
Надеюсь, это поможет кому-то!