7

キャプチャしたビデオ フレームの特定した座標に画像を配置したいと考えています。

以前に尋ねたところ、使用するように言われましたが、別の画像を追加したい座標でトリミングしたくcvCopyありません。cvSetImageROI多分それは正しい方法ですが、私はそれを理解していませんでした(正しい場合は説明してください)。

4

4 に答える 4

7

少し前にSetRoiでやってみたらこんな感じでした。私は2つの画像を持っています。1つは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);

それはそれについてです。

于 2009-12-11T14:03:51.920 に答える
6
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.
于 2010-08-09T15:35:47.573 に答える
0

ソースからコピー先にピクセルごとにコピーする必要があります。以下のコードは正確にそれを行い、座標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);
        }
    }
}
于 2009-10-19T10:25:02.227 に答える