Place an image on an image

前端 未结 4 1723
隐瞒了意图╮
隐瞒了意图╮ 2020-12-29 14:34

I want to place an image on a captured video frame at the coordinates which I determined.

I asked that before and I have been told to use cvCopy and

相关标签:
4条回答
  • 2020-12-29 14:50

    You will have to copy pixel by pixel from the source to the destination. The code below does precisely that, offseting with coordinates x and y. I haven't actually tried this, but am fairly certain it should work more or less as you'd expect.

    Just make sure the target image is at least the size of the source plus the offset!

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-29 14:52
    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);
            }
        }
    }
    

    To use it

    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.
    
    0 讨论(0)
  • 2020-12-29 14:54

    I did this a while ago using SetRoi, it was something like this. I have two images, one is a thumbnail called thumb_frame that is the small picture I will include in the large image 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);
    

    That's about it.

    0 讨论(0)
  • 2020-12-29 15:04

    Unfortunately the "Paul Lammertsma" code has mixed up indexes here you have fixed code:

    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);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题