Наложение меньшего изображения на большое изображение в OpenCV - PullRequest
2 голосов
/ 03 апреля 2012

Я хотел бы заменить часть изображения своим изображением в Opencv

Я использовал

cvGetPerspectiveMatrix() with a warpmatrix and using cvAnd() and cvOr()

, но не смог заставить его работать

Этокод, который в данный момент отображает изображение, и белый многоугольник для замещающего изображения.Я хотел бы заменить белый многоугольник на изображение с любым измерением, которое будет масштабировано и заменено указанным регионом.

Пока код находится в javacv, я могу преобразовать его в java, даже если код c опубликован

grabber.start();
while(isDisp() && (image=grabber.grab())!=null){
  if (dst_corners !=  null) {// corners of the image to be replaced
  CvPoint points = new CvPoint((byte) 0,dst_corners,0,dst_corners.length);
  cvFillConvexPoly(image,points, 4, CvScalar.WHITE, 1, 0);//white polygon covering the replacement image 
  }
correspondFrame.showImage(image);
}

Любые указатели на это будут очень полезны.

Обновление:

Я использовал warpmatrix с этим кодом, и я получил черное пятно для наложенного изображения

cvSetImageROI(image, cvRect(x1,y1, overlay.width(), overlay.height()));
CvPoint2D32f p = new CvPoint2D32f(4);
CvPoint2D32f q = new CvPoint2D32f(4);

q.position(0).x(0);
q.position(0).y(0);
q.position(1).x((float) overlay.width());
q.position(1).y(0);
q.position(2).x((float) overlay.width());
q.position(2).y((float) overlay.height());
q.position(3).x(0);
q.position(3).y((float) overlay.height());

p.position(0).x((int)Math.round(dst_corners[0]);
p.position(0).y((int)Math.round(dst_corners[1]));
p.position(1).x((int)Math.round(dst_corners[2]));
p.position(1).y((int)Math.round(dst_corners[3]));
p.position(3).x((int)Math.round(dst_corners[4]));
p.position(3).y((int)Math.round(dst_corners[5]));
p.position(2).x((int)Math.round(dst_corners[6]));
p.position(2).y((int)Math.round(dst_corners[7]));

cvGetPerspectiveTransform(q, p, warp_matrix);

cvWarpPerspective(overlay, image, warp_matrix);

Я получаю черное пятно для оверлейного изображения, и хотя исходное изображение представляет собой многоугольник с 4 вершинами, оверлейное изображение устанавливается в виде прямоугольника.Я считаю, что это из-за ROI.Может ли кто-нибудь сказать мне, как подогнать изображение как есть, а также почему я получаю черное пятно вместо наложенного изображения.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

Я думаю, cvWarpPerspective ( ссылка ) - это то, что вы ищете.

Поэтому вместо того, чтобы делать

CvPoint points = new CvPoint((byte) 0,dst_corners,0,dst_corners.length);
cvFillConvexPoly(image,points, 4, CvScalar.WHITE, 1, 0);//white polygon covering the replacement image

Попробуйте

cvWarpPerspective(yourimage, image, M, image.size(), INTER_CUBIC, BORDER_TRANSPARENT);

Где M - матрица, которую вы получаете от cvGetPerspectiveMatrix

0 голосов
/ 04 апреля 2012

Один из способов сделать это - масштабировать изображение до размера белого многоугольника, а затем скопировать его в захваченное изображение, задав его интересующую область (здесь ссылка , объясняющая ROI). Ваш код должен выглядеть так:

resize(pic, resizedImage, resizedImage.size(), 0, 0, interpolation); //resizedImage should have the points size
cvSetImageROI(image, cvRect(the points coordinates));
cvCopy(resizedImage,image);
cvResetImageROI(image);

Надеюсь, это поможет.

С уважением, Daniel

...