我不知道有任何来自opencv
的直接函数,但我编写了显式方法来执行该操作。
CV_8UC4
。 在使用该样本时,您可以轻松地将该方法扩展到其他版本。void merge_images(cv::Mat* background, cv::Mat* upcoming, int x, int y)
{
auto handle_cv_8uc4 = [=](int i, int j)
{
if(upcoming->at<cv::Vec4b>(j, i)[3] > 10)//10 is only epsilon for trash hold, you can put also 0 or anything else.
{
background->at<cv::Vec4b>(y+j, x+i) = upcoming->at<cv::Vec4b>(j, i);
}
};
auto handle_cv_8uc3 = [=](int i, int j)
{
background->at<cv::Vec4b>(y+j, x+i)[0] = upcoming->at<cv::Vec3b>(j, i)[0];
background->at<cv::Vec4b>(y+j, x+i)[1] = upcoming->at<cv::Vec3b>(j, i)[1];
background->at<cv::Vec4b>(y+j, x+i)[2] = upcoming->at<cv::Vec3b>(j, i)[2];
background->at<cv::Vec4b>(y+j, x+i)[3] = 255;
};
for(int i = 0; i < upcoming->cols; i++)
{
for(int j = 0; j < upcoming->rows; j++)
{
if(j + y >= background->rows)
{
break;
}
if(x + i >= background->cols)
{
return;
}
switch(upcoming->channels())
{
case 3:
{
handle_cv_8uc3(i, j);
break;
}
case 4:
{
handle_cv_8uc4(i, j);
break;
}
default:
{
//maybe error?
}
}
}
}
}
我认为这段代码可以自我解释。如果有不清楚的地方,请随时提问。
现在,如果您想使用该代码,假设您有background
和spr
,并且您想将spr
放置到background
中:
cv::Mat dst(background.rows, background.cols, CV_8UC4);
merge_images(&dst, &background, 0, 0);
merge_images(&dst, &spr, 50, 50);
cv::Mat dst(background.rows, background.cols, CV_8UC4);
准备一个与背景大小相同的矩阵(以避免修改原始背景)。
merge_images(&dst, &background, 0, 0);
为您准备的副本添加背景
merge_images(&dst, &spr, 50, 50);
添加图片,使其左上角位于(50,50)
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
代替dst = cv.add(img1_bg,img2_fg)
。 - Santhosh Dhaipule Chandrakanth