1. 程式人生 > >Opencv貼圖的兩種方式

Opencv貼圖的兩種方式

白底不貼,遍歷畫素時,若為白色,則忽略,否則將畫素值複製到背景上
因為目標圖片中可能含有白色點,並且對摳出的圖片要求挺高的不然就會出現第二幅圖的效果,所以這種方式侷限性較大。

void Drawtoback(Mat image, Mat background, int y, int x)
{
    for (int i = 0; i < image.rows; i++)
    {
        for (int j = 0; j < image.cols; j++)
        {
            int a = image.at<Vec3b>(i, j)[2
]; int b = image.at<Vec3b>(i, j)[1]; int c = image.at<Vec3b>(i, j)[0]; if (!(a == 255 && b == 255 && c == 255)) { <>background.at<Vec3b>(i + x, j + y)[2] = image.at<Vec3b>(i, j)[2]; <>background.at<Vec3b>(i + x, j + y)[1
] = image.at<Vec3b>(i, j)[1]; <>background.at<Vec3b>(i + x, j + y)[0] = image.at<Vec3b>(i, j)[0]; } } } }
//透明底不貼,通過將圖片儲存為含有四通道的png格式,判斷alpha值!=0,不貼透明底 
void Drawtoback(Mat image, Mat background, int y, int x)
{
    for (int i = 0; i < image
.rows; i++) { for (int j = 0; j < image.cols; j++) { if (image.at<Vec4b>(i, j)[3] != 0) { background.at<Vec3b>(i + x, j + y)[2] = image.at<Vec4b>(i, j)[2]; background.at<Vec3b>(i + x, j + y)[1] = image.at<Vec4b>(i, j)[1]; background.at<Vec3b>(i + x, j + y)[0] = image.at<Vec4b>(i, j)[0]; } } } }

將一個目標物體貼在選定的背景上這裡介紹兩種方式,其實實質是相同的。用摳圖軟體將影象摳出,
第一種是將影象存於一張白底的背景上
第二種是透明背景的png格式
貼圖之後的效果如下:
白底VS透明背景
白色背景貼圖
透明背景貼圖