C++ copyTo在opencvc++;作品

C++ copyTo在opencvc++;作品,c++,opencv,C++,Opencv,我浏览了下面的代码片段,想知道opencv函数中的copyTo()是如何工作的 // Make a copy Mat faceWithGlassesNaive1 = faceImage.clone(); // Take the eye region from the image Mat roiFace = faceWithGlassesNaive1(Range(150,250),Range(140,440)); // Replace the eye region with the s

我浏览了下面的代码片段,想知道opencv函数中的
copyTo()是如何工作的

 // Make a copy
 Mat faceWithGlassesNaive1 = faceImage.clone();
 // Take the eye region from the image
 Mat roiFace =  faceWithGlassesNaive1(Range(150,250),Range(140,440));
 // Replace the eye region with the sunglass image
 glassBGR.copyTo(roiFace);
copyTo()
是否使用
copyByreference
,以便对
roiface
所做的任何修改都反映在
faceWithGlassesNaive1
中?还是我遗漏了什么?。我需要帮助

  • 下面是面部图像
  • 下面是glassBGR图像

  • 下面是上述代码片段的
    glassBGR.copyTo(roiFace)
    输出


  • copyTo
    opencv的功能如下所示:

    该方法将矩阵数据复制到另一个矩阵

    因此,你不能期望像那样完成你的任务,但你可以简单地通过以下方式实现:

    守则:

    #include <iostream>    
    #include <opencv2/imgproc.hpp>
    #include <opencv2/highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    
        Mat faceImage = imread("/ur/face/image/directory/elon.jpg");
        Mat glassBGR = imread("/ur/glass/image/directory/glass.png");
    
        resize(glassBGR,glassBGR,Size(300,100));
        // check each pixel of glass and if its white(255,255,255) then change it with face image pixels
        for(int i=0;i<glassBGR.cols;i++)
        {
            for(int j=0;j<glassBGR.rows;j++)
            {
                if(!(glassBGR.at<Vec3b>(j, i) == Vec3b(255,255,255)))
                {
                    faceImage.at<Vec3b>(j+150,i+140) = glassBGR.at<Vec3b>(j, i);
                }
            }
        }
        
        imshow("result",faceImage);
        waitKey(0);        
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    使用名称空间cv;
    int main()
    {
    Mat faceImage=imread(“/ur/face/image/directory/elon.jpg”);
    Mat glassBGR=imread(“/ur/glass/image/directory/glass.png”);
    调整大小(glassBGR,glassBGR,大小(300100));
    //检查玻璃的每个像素,如果是白色(255255),则使用面部图像像素进行更改
    对于(int i=0;i,从:

    将矩阵复制到另一个矩阵

    该方法将矩阵数据复制到另一个矩阵。复制前 方法调用的数据:

    m.create(this->size(), this->type());
    
    因此,目标矩阵 当m.copyTo(m);完美地工作时 函数不处理 源和目标矩阵

    因此,您的数据将被复制,而更改将不会反映回原始图像。如果您想消除副本中的白色像素,可以提供一个掩码(语法可能不同,从内存执行此操作):

    您的实际问题是,
    roiFace
    只是
    faceWithGlassesNaive1
    内存的别名。因此更改应用于
    roiFace
    (例如,将新数据复制到其中)在这种情况下,
    roiFace
    的创建将反映回
    faceWithGlassesNaive1
    copyTo
    不是您的问题

    发件人:

    […]与上述所有操作类似,运算符是O(1)操作,即 即,不复制矩阵数据


    我认为您对
    copyTo()
    函数的期望是错误的,请检查您是否可以用自己的代码通过简单的算法实现它。您也可以检查
    Mat glassGray;
    cvtColor(glassBGR, glassGray, COLOR_BGR2GRAY);
    glassBGR.copyTo(roiFace, glassGray != 255);