是否可以使用opencv将旋转的图像复制到另一个图像的旋转的ROI中?

时间:2014-04-01 12:35:48

标签: c++ image opencv

很抱歉再次提出相同的问题,但我已经尝试了很多方法,但我仍然无法做我想做的事情,而我甚至不确定它是什么&我单独使用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中做我想做的事情? 谢谢!

enter image description here

在使用下面的方法和面具后,我得到了这张图像,看到被roi切断,我用它来说出图像中我要复制旋转图像的位置。基本上现在我已经屏蔽了图像,我该如何选择将这个蒙版图像放到第二张图像中的位置。目前我使用的是矩形,但由于我的图像不再是矩形而是旋转的矩形,因此不能工作。看一下代码,看看我现在是怎么做错的(它会中断,如果我把矩形变大,会抛出异常)。

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

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:4)

您可以使用遮罩来复制,而不是ROI,

  1. 首先使用旋转的rect创建遮罩。

  2. 使用此掩码将源图像复制到目标图像

  3. 见下面的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);
    

    enter image description here enter image description here