Skip to main content

OpenCV : Image synthesis (ROI, Mask, Binary)

Today we will make Image synthesis by using ROI, Masking, binarization.





The full code is like that.

#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;

int main() {
    Mat me = imread("./res/pic/mh.jpg");
    Mat animal = imread("./res/pic/animal_head.png");
    Mat animalGray;
    Mat mask_ani;
    Mat mask_ani_inv;
    imshow("me origin", me);
    imshow("animal", animal);
    cvtColor(animal, animalGray, CV_BGR2GRAY); // color to black and white    
    threshold(animalGray, mask_ani, 10, 255, 0); // make binary    
    bitwise_not(mask_ani, mask_ani_inv);
    imshow("mask ani inv", mask_ani_inv);
    imshow("mask ani", mask_ani);

    Mat imgRoi;
    imgRoi = me(Rect(50, 50, animal.cols, animal.rows));
    imshow("imgRoi", imgRoi);
    Mat me_back;
    Mat ani_for;

    bitwise_and(animal, animal, ani_for, mask_ani); // mask with mask_ani    
    bitwise_and(imgRoi, imgRoi, me_back, mask_ani_inv); // mask with mask_ani_inv    
    imshow("ani_for", ani_for);
    imshow("me_back", me_back);

    Mat dst;
    add(me_back, ani_for, dst); //add background of roi , foreground of animal    
    dst.copyTo(imgRoi); // result copy to imgRoi    imshow("dst", dst);
    imshow("result", me);
    waitKey(0);
    return 0;
}



  • Make binary images for masking background and foreground images

cvtColor(animal, animalGray, CV_BGR2GRAY); // color to black and white
threshold(animalGray, mask_ani, 10, 255, 0); // make binary
bitwise_not(mask_ani, mask_ani_inv);



  • Make image ROI and fit to the synthesis position.
Mat imgRoi;
// start at x:50, y:50, size width: animal.cols, height: animal.rows
imgRoi = me(Rect(50, 50, animal.cols, animal.rows)); 
imshow("imgRoi", imgRoi);




  • Remove animal image background and the part of the image ROI that will contain the animal picture by using bitwise operation.
Mat me_back;
Mat ani_for;
bitwise_and(animal, animal, ani_for, mask_ani); // remove background
bitwise_and(imgRoi, imgRoi, me_back, mask_ani_inv); // remove foreground
imshow("ani_for", ani_for);
imshow("me_back", me_back);




  • Finally add background of ROI, foreground of animal image.
Mat dst;
add(me_back, ani_for, dst); //add background of roi , foreground of animal
dst.copyTo(imgRoi); // result copy to imgRoi
imshow("dst", dst);
imshow("result", me);
waitKey(0);



Comments

Popular posts from this blog

OpenGL SL - Show Video and Image

The simple image is made like this. void  mainImage(  out   vec4  fragColor,  in   vec2  fragCoord ){      // Normalized pixel coordinates (from 0 to 1)      vec2  uv = fragCoord/iResolution.xy;           //uv.x = uv.x - 0.3;      fragColor =  texture (iChannel0, uv); } I think GPU processing has two major steps. Normalizing and Pointing. 1. Normalizing Each pixel has screen coordinate and we need to normalizing from 0.0 to 1.0, because there are many displays with various resolutions around us. We can not manage it at each resolution. It is very troublesome. So we should normalize it :   vec2   uv = fragCoord/iResolution.xy; 2. Pointing I told you each pixel has a screen coordinate. At each coordinate we need to link with sampler's coordinate. Sampler has also coordinate 0.0 to 1.0. As a result, we see the samplers p...

How to make gaussian blur in SparkAR

 Gaussian blur is result of blurring an image by Gaussian function. We need to use large kernel to make strong blur and this cause the high complexity. And that's why we should use multi-pass which is seperated into horizontal, vertical pass . It can reduce the complexity and make faster. In Spark AR there are many ways to make it. And I wanna introduce one of them using shader files (.sca). You can download it for free from the gumload link below. It is modulated to adjust horizontal, vertical strength easily . Hope this can help you. Loading...

OpenGL SL - Select compiler (Shader Toy)

GLSL (OpenGL Shading Language)   is a language that enables developers to directly control the graphics pipeline.  We will do GPU programming using GLSL.  And I recommend the Shadertoy to easily program it. By using Shadertoy, y ou can see the results of GLSL programming on the screen without OpenGL. It looks like below. I made simple mosaic effect. The great thing of this is you can program and take result on the screen in real time. We do not need to write GL code directly :) But this tool also has some rules. Because we don't program GL, there are some promised uniform variables. And I'll introduce some important input uniforms. uniform vec3 iResolution    (x,y,z of your screen resolution) uniform float iTime             (current time second info) uniform float iFrame              (current frame number info) uniform vec4 iMouse   ...