C++ copyTo在opencvc++;作品
我浏览了下面的代码片段,想知道opencv函数中的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
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);