Opencv貼圖的兩種方式
阿新 • • 發佈:2019-01-02
白底不貼,遍歷畫素時,若為白色,則忽略,否則將畫素值複製到背景上
因為目標圖片中可能含有白色點,並且對摳出的圖片要求挺高的不然就會出現第二幅圖的效果,所以這種方式侷限性較大。
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格式
貼圖之後的效果如下: