【问题标题】:Is it possible to copy a rotated image into a rotatedrect ROI of another image with opencv?是否可以使用opencv将旋转图像复制到另一个图像的rotatedrect ROI中?
【发布时间】:2014-05-12 05:42:55
【问题描述】:

好吧,很抱歉再次问了几乎相同的问题,但我尝试了很多方法,但我仍然无法做我想做的事情,我什至不确定单独使用 opencv 是否可行。 我旋转了一个图像,我想将它复制到另一个图像中。问题是,无论我以何种方式裁剪这个旋转的图像,它总是在第二个图像内复制,并在其周围没有旋转的正方形。如下图所示。(忘记白色部分没关系)。我只想删除条纹部分。 我相信我的问题在于我将图像复制到的 ROI,因为该 ROI 是矩形而不是 RotatedRect。如下代码所示。

cv::Rect roi(Pt1.x, Pt1.y, ImageAd.cols, ImageAd.rows);
ImageAd.copyTo(ImageABC(roi));

但我不能像下面的代码中那样使用 rotateRect 复制到...

cv::RotatedRect roi(cent, sizeroi, angled);
ImageAd.copyTo(ImageABC(roi));

那么有没有办法在opencv中做我想做的事? 谢谢!

在使用下面的方法和蒙版后,我得到了这个图像,如图所示,它被 roi 截断,我用它来表示我想在图像中的哪个位置复制我的旋转图像。基本上现在我已经屏蔽了图像,我如何选择将这个蒙面图像放入我的第二张图像的位置。目前我使用一个矩形,但这不起作用,因为我的图像不再是一个矩形而是一个旋转的矩形。查看代码以了解我目前是如何错误地执行此操作的(它会中断,如果我使 rect 变大,则会引发异常)。

cv::Rect roi(Pt1.x, Pt1.y, creditcardimg.cols, creditcardimg.rows); 
        creditcardimg.copyTo(imagetocopyto(roi),mask);

【问题讨论】:

  • 您要从旋转的矩形复制还是复制到旋转的矩形?使用蒙版的思路是: 1. source 是旋转后的图像。 2. 旋转矩形在该旋转图像内构建 roi。 3. 创建一个看起来像旋转矩形的蒙版。 4. 仅使用该掩码进行复制。 5. 结果是只有旋转矩形中的像素在黑色背景下可见的图像。
  • 两者兼而有之,因为在计算出我要复制的图像的掩码后,我还想将此图像(仅掩码位)放入另一个图像中。现在的问题是如何在 copyTo 中指定要放置此旋转和蒙版图像的位置的坐标。如果我使用 rect roi,它将被放置在另一个没有真正帮助的非旋转矩形内。
  • this solution 你之前的问题有什么问题?
  • 我的目标角被检测到并且没有形成一个完美的矩形。所以我不会有相应的角插入到getPerspectiveTransform中。
  • @Fionn 我仍然不知道您是要在复制时旋转矩形还是要按原样复制,但只有 roi(这是一个旋转的矩形)

标签: c++ image opencv


【解决方案1】:

你可以用蒙版代替ROI来复制,

  1. 首先使用旋转矩形创建蒙版。

  2. 使用此蒙版将源图像复制到目标图像

参见下面的 C++ 代码

您的旋转矩形,我手动计算。

RotatedRect rRect = RotatedRect(Point2f(140,115),Size2f(115,80),192);

使用绘制轮廓创建蒙版。

   Point2f vertices[4];
   rRect.points(vertices);
   Mat mask(src.rows, src.cols, CV_8UC1, cv::Scalar(0));
   vector< vector<Point> >  co_ordinates;
   co_ordinates.push_back(vector<Point>());
   co_ordinates[0].push_back(vertices[0]);
   co_ordinates[0].push_back(vertices[1]);
   co_ordinates[0].push_back(vertices[2]);
   co_ordinates[0].push_back(vertices[3]);
   drawContours( mask,co_ordinates,0, Scalar(255),CV_FILLED, 8 );

最后使用上面的掩码将源复制到目标。

    Mat dst;
    src.copyTo(dst,mask);

【讨论】:

  • 好的,谢谢,所以我创建了一个仅包含旋转矩形内的点的蒙版,然后我使用Mat::copyTo(OutputArray m, InputArray mask) 复制到图像?
  • 谢谢,但它不起作用。输出图像不包含我要复制到的图像中的任何像素。如上图所示。
  • 好的,所以我完全按照您在上面所做的操作,只是没有像您那样有一个空的 dst,我有另一个图像可以将这个旋转的图像复制到其中。所以你的面具确实有效(我尝试只使用一个空的 dst)但是为了复制到这个图像我需要指定复制到哪里。所以在我像上面的代码一样使用 rect roi 之前。因此,在计算出正确的掩码后,我运行此代码 cv::Rect roi(Pt1.x, Pt1.y, creditcardimg.cols, creditcardimg.rows); creditcardimg.copyTo(imagetocopyto(roi),mask); 但这不起作用可能是因为 roi 是一个矩形而不是旋转的矩形
  • 所以你需要先对齐你的面具,根据你正确的目标位置?
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多