我有 2 張透明的影像。影像具有相同的格式和大小。如何使用 C OpenCV 將像素從第二個影像復制到第一個影像?這個想法是在第一個影像上繪制第二個影像。
謝謝
uj5u.com熱心網友回復:
來自上面評論中鏈接的代碼(針對我的情況進行了修改)L. Scott Johnson 再次感謝您!
void alphaBlend(Mat& foreground, Mat& background, Mat& alpha, Mat& outImage)
{
// Find number of pixels.
int numberOfPixels = foreground.rows * foreground.cols * foreground.channels();
// Get floating point pointers to the data matrices
float* fptr = reinterpret_cast<float*>(foreground.data);
float* bptr = reinterpret_cast<float*>(background.data);
float* aptr = reinterpret_cast<float*>(alpha.data);
float* outImagePtr = reinterpret_cast<float*>(outImage.data);
// Loop over all pixesl ONCE
for (
int i = 0;
i < numberOfPixels;
i , outImagePtr , fptr /*, aptr */, bptr
)
{
if (i!= 0 && (i % 3) == 0)
aptr ;
*outImagePtr = (*fptr) * (*aptr) (*bptr) * (1 - *aptr);
}
}
void Mix()
{
Mat layer = imread("images\\leyer.png", IMREAD_UNCHANGED);
Mat image = imread("images\\bg.jpg");
std::vector<cv::Mat> bgra_planes;
cv::split(layer, bgra_planes);
Mat alpha = bgra_planes[3];
bgra_planes.pop_back();
cv::merge(bgra_planes, layer);
alpha.convertTo(alpha, CV_32FC3, 1.0 / 255);
layer.convertTo(layer, CV_32FC3);
image.convertTo(image, CV_32FC3);
Mat result(layer.size(), CV_32FC3);
alphaBlend(layer, image, alpha, result);
result.convertTo(result, CV_8UC3);
// previous tries
//cv::copyTo(layer, image, );
//cv::addWeighted(image, 1, layer, 1, 0.5, result);
String windowName = "alpha blending";
namedWindow(windowName, WINDOW_NORMAL);
imshow(windowName, result);
waitKey(0);
destroyWindow(windowName);
}
uj5u.com熱心網友回復:
您可以嘗試以下方法:
加載你的第一張圖片
cv::Mat img = cv::imread("img.jpeg");
找到您的較小影像 - 在這里我只是調整相同影像的大小
cv::Mat img_resize;
cv::resize(img, img_resize, cv::Size(), 0.3, 0.3);
選擇 xy 原點位置
const cv::Point origin(100, 100);
創建一個感興趣的區域
cv::Rect roi(origin, img_resize.size());
將矩陣資料復制到
img_resize.copyTo(img(roi));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/352446.html
上一篇:模板變數不能到處決議
