gpt4 book ai didi

c++ - OpenCV 在 warpAffine 期间保持背景透明

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:08 35 4
gpt4 key购买 nike

我使用 warpPerspective() 函数创建鸟瞰图像,如下所示:

warpPerspective(frame, result, H, result.size(), CV_WARP_INVERSE_MAP, BORDER_TRANSPARENT);

结果看起来非常好,而且边框是透明的: Bird-View-Image

现在我想将这张图片放在另一张图片“out”之上。我试着用函数 warpAffine 这样做:

warpAffine(result, out, M, out.size(), CV_INTER_LINEAR, BORDER_TRANSPARENT);

我还根据已经在 stackoverflow 上提出的问题将“输出”转换为带有 alpha channel 的四 channel 图像: Convert Image

这是代码:cvtColor(out, out, CV_BGR2BGRA);

我希望看到棋盘而不是灰色背景。但实际上,我的结果是这样的:

Result Image

我做错了什么?我忘记做些什么了吗?还有另一种方法可以解决我的问题吗?任何帮助表示赞赏:)

谢谢!

最好的问候DamBedEi

最佳答案

我希望有更好的方法,但这里是您可以做的事情:

  1. 正常做 warpaffine(没有透明的东西)
  2. 找到包含扭曲图像的轮廓
  3. 使用此轮廓创建蒙版(图像内的白色值扭曲,边界黑色)
  4. 使用此 mask 将扭曲的图像复制到另一幅图像中

    lena IKnowOpencv
    result

示例代码:

// load images
cv::Mat image2 = cv::imread("lena.png");
cv::Mat image = cv::imread("IKnowOpencv.jpg");
cv::resize(image, image, image2.size());

// perform warp perspective
std::vector<cv::Point2f> prev;
prev.push_back(cv::Point2f(-30,-60));
prev.push_back(cv::Point2f(image.cols+50,-50));
prev.push_back(cv::Point2f(image.cols+100,image.rows+50));
prev.push_back(cv::Point2f(-50,image.rows+50 ));
std::vector<cv::Point2f> post;
post.push_back(cv::Point2f(0,0));
post.push_back(cv::Point2f(image.cols-1,0));
post.push_back(cv::Point2f(image.cols-1,image.rows-1));
post.push_back(cv::Point2f(0,image.rows-1));
cv::Mat homography = cv::findHomography(prev, post);
cv::Mat imageWarped;
cv::warpPerspective(image, imageWarped, homography, image.size());

// find external contour and create mask
std::vector<std::vector<cv::Point> > contours;
cv::Mat imageWarpedCloned = imageWarped.clone(); // clone the image because findContours will modify it
cv::cvtColor(imageWarpedCloned, imageWarpedCloned, CV_BGR2GRAY); //only if the image is BGR
cv::findContours (imageWarpedCloned, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

// create mask
cv::Mat mask = cv::Mat::zeros(image.size(), CV_8U);
cv::drawContours(mask, contours, 0, cv::Scalar(255), -1);

// copy warped image into image2 using the mask
cv::erode(mask, mask, cv::Mat()); // for avoid artefacts
imageWarped.copyTo(image2, mask); // copy the image using the mask

//show images
cv::imshow("imageWarpedCloned", imageWarpedCloned);
cv::imshow("warped", imageWarped);
cv::imshow("image2", image2);
cv::waitKey();

关于c++ - OpenCV 在 warpAffine 期间保持背景透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32230252/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com