Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以使用opencv将旋转图像复制到另一个图像的rotatedrect ROI中?_C++_Image_Opencv - Fatal编程技术网

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

C++ 是否可以使用opencv将旋转图像复制到另一个图像的rotatedrect ROI中?,c++,image,opencv,C++,Image,Opencv,好的,很抱歉再次问了几乎相同的问题,但我已经尝试了许多方法,但我仍然无法完成我正在尝试做的事情,我甚至不确定单独使用opencv是否可行。 我已经旋转了一个图像,我想把它复制到另一个图像中。问题是,无论我以何种方式裁剪这个旋转的图像,它都会复制到第二个图像中,周围有一个未旋转的正方形。如下图所示(忽略白色部分即可)。我只想去掉有条纹的部分。 我相信我的问题在于我复制图像的ROI,因为这个ROI是一个矩形而不是旋转矩形。如下面的代码所示 cv::Rect roi(Pt1.x, Pt1.y, Ima

好的,很抱歉再次问了几乎相同的问题,但我已经尝试了许多方法,但我仍然无法完成我正在尝试做的事情,我甚至不确定单独使用opencv是否可行。 我已经旋转了一个图像,我想把它复制到另一个图像中。问题是,无论我以何种方式裁剪这个旋转的图像,它都会复制到第二个图像中,周围有一个未旋转的正方形。如下图所示(忽略白色部分即可)。我只想去掉有条纹的部分。 我相信我的问题在于我复制图像的ROI,因为这个ROI是一个矩形而不是旋转矩形。如下面的代码所示

cv::Rect roi(Pt1.x, Pt1.y, ImageAd.cols, ImageAd.rows);
ImageAd.copyTo(ImageABC(roi));
但是我不能像下面的代码那样用旋转体复制到

cv::RotatedRect roi(cent, sizeroi, angled);
ImageAd.copyTo(ImageABC(roi));
那么,有没有一种方法可以在opencv中实现我想要的功能呢? 谢谢

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


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

  • 首先使用旋转矩形创建遮罩

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

  • <参见下面的C++代码< /P> 你的旋转矩形和我手动计算

    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::copyTo(输出阵列m,输入阵列掩码)
    复制到图像?谢谢,但它不起作用。输出图像不包含我要复制到的图像中的任何像素。如上图所示。好的,我和你做的完全一样,除了没有像你一样有一个空的dst,我有另一个图像,在其中复制这个旋转的图像。因此,您的掩码确实起作用(我尝试只使用一个空dst),但为了复制到此图像,我需要指定复制到的位置。所以在我之前,我只是在上面的代码中使用了rect roi。所以在计算出正确的掩码之后,我运行这个代码
    cv::Rect roi(Pt1.x,Pt1.y,creditcardmg.cols,creditcardmg.rows);creditcardmg.copyTo(图像复制到(roi),掩码)但这可能不起作用,因为roi是一个矩形,而不是旋转矩形,所以您需要首先根据您的目标位置对齐您的遮罩,对吗?@Fionn在这里也看到了答案,我使用了一些偏移量来使用roi正确对齐遮罩。您想从旋转矩形复制还是复制到旋转矩形?使用面具的想法是:1。源是旋转后的图像。2.旋转矩形在旋转图像内构建roi。3.创建一个看起来像旋转矩形的遮罩。4.仅使用该遮罩进行复制。5.结果是一个图像,其中只有旋转矩形中的像素在黑色背景下可见。这两者兼而有之,因为在计算出要复制的图像的遮罩后,我还想将此图像(仅遮罩位)放置到另一个图像中。现在的问题是如何在copyTo中指定要放置旋转和遮罩图像的坐标。如果我使用rect roi,它只会被放置在另一个没有旋转的矩形中,这并没有真正的帮助。你的上一个问题有什么问题?我的目标角被检测到,并没有形成一个完美的矩形。因此,我将没有相应的角点插入getPerspectiveTransform。@Fionn我仍然不知道在复制时是否要旋转矩形,或者是否要按原样复制,而只知道roi(这是一个旋转的矩形)
    
       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);