Поместите изображение на изображение
Я хочу разместить изображение на захваченном видеокадре с координатами, которые я определил.
Я спрашивал об этом раньше, и мне сказали использовать cvCopy
а также cvSetImageROI
но я не хочу обрезать по этим координатам, я хочу добавить другое изображение. Может быть, это правильный путь, но я не понял этого (если это правильно, пожалуйста, объясните это).
4 ответа
Я сделал это некоторое время назад, используя SetRoi, это было что-то вроде этого. У меня есть два изображения, одно из которых - thumb_frame, маленькая картинка, которую я включу в большое изображение show_frame
//I set the ROI to the same size as the thumb_frame
cvSetImageROI(show_frame.image, cvRect(thumbnail_x_pos,
thumbnail_y_pos, thumb_frame->width, thumb_frame->height));
//I add the image to the designated ROI
cvAddWeighted(thumb_frame, alpha, show_frame, beta, 0, show_frame);
Вот и все.
void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location, CvScalar S, CvScalar D)
{
int x,y,i;
for(x=0;x < overlay->width -10;x++)
//replace '-10' by whatever x position you want your overlay image to begin.
//say '-varX'
{
if(x+location.x>=src->width) continue;
for(y=0;y < overlay->height -10;y++)
//replace '-10' by whatever y position you want your overlay image to begin.
//say '-varY'
{
if(y+location.y>=src->height) continue;
CvScalar source = cvGet2D(src, y+location.y, x+location.x);
CvScalar over = cvGet2D(overlay, y, x);
CvScalar merged;
for(i=0;i<4;i++)
merged.val[i] = (S.val[i]*source.val[i]+D.val[i]*over.val[i]);
cvSet2D(src, y+location.y, x+location.x, merged);
}
}
}
Использовать его
cvOverlayImage(largerimage, overlayimage, cvPoint(10, 10), cvScalar(0.5,0.5,0.5,0.5), cvScalar(0.5,0.5,0.5,0.5));
//The cvPoint(10,10) can be the cvPoint(varX,varY) depending on how you write the function
//and how you want to use it.
//You cannot choose values less than 'varX' and 'varY' in this case
//else you would see a runtime error.
Вам придется копировать попиксельно из источника в место назначения. Код ниже делает именно это, сдвиг с координатами x
а также y
, Я на самом деле не пробовал это, но вполне уверен, что это должно работать более или менее, как вы ожидаете.
Просто убедитесь, что целевое изображение имеет как минимум размер источника плюс смещение!
void drawImage(IplImage* target, IplImage* source, int x, int y) {
for (int ix=0; x<source->width; x++) {
for (int iy=0; y<source->height; y++) {
int r = cvGet2D(source, iy, ix).val[2];
int g = cvGet2D(source, iy, ix).val[1];
int b = cvGet2D(source, iy, ix).val[0];
CvScalar bgr = cvScalar(b, g, r);
cvSet2D(target, iy+y, ix+x, bgr);
}
}
}
К сожалению, код "Paul Lammertsma" перепутал индексы, здесь вы исправили код:
void drawImage(IplImage* target, IplImage* source, int x, int y) {
for (int ix=0; ix<source->width; ix++) {
for (int iy=0; iy<source->height; iy++) {
int r = cvGet2D(source, iy, ix).val[2];
int g = cvGet2D(source, iy, ix).val[1];
int b = cvGet2D(source, iy, ix).val[0];
CvScalar bgr = cvScalar(b, g, r);
cvSet2D(target, iy+y, ix+x, bgr);
}
}
}