假设img 已经是包含角色的子图像,并且您知道该子图像在原始图像中的位置,并且两个图像都是8UC1type:
int offsetY=10;
int offsetX=40;
for(int j=0;j<img.rows;j++)
for (int i=0;i<img.cols;i++)
{
image.at<uchar>(j+offsetY,i+offsetX)=img.at<uchar>(j,i);
}
如果两个图像都不是8UC1 类型而是8UC3 类型,请将<uchar> 替换为<Vec3b>. If one of them is8UC1and the other is8UC3` 您必须先转换或手动转换。
如果img 与original 未更改子图像,您可以轻松地直接使用和复制子图像,而无需创建img,这样会更快,并且您不必关心类型。
以下是两个例子:
灰度图像:
int main()
{
// here: read original image as 8UC1 (which is grayscale)
cv::Mat original = cv::imread("characterC_original.png", CV_LOAD_IMAGE_GRAYSCALE);
// this is the image with the character only. In 8UC1 type too
cv::Mat img = cv::imread("characterC.png", CV_LOAD_IMAGE_GRAYSCALE);
// this is where the character was placed in original. If you have this informationalready somehwere else, you can use that directly.
int offsetX = 40;
int offsetY = 10;
int width = img.cols;
int height = img.rows;
cv::Mat image = cv::Mat(original.rows, original.cols, original.type());
image.setTo(cv::Scalar::all(255));
for(int j=0;j<img.rows;j++)
for (int i=0;i<img.cols;i++)
{
// here you use uchar since it's 8UC1
image.at<uchar>(j+offsetY,i+offsetX)=img.at<uchar>(j,i);
}
cv::imshow("original", original);
cv::imshow("char copied", image);
cv::imwrite("characterC_result_8UC1.png", image);
cv::waitKey(-1);
}
这是嵌入在 RGB 图像中的黑白图像:
int main()
{
//here: read original image as 8UC3 (which is an RBG image)
cv::Mat original = cv::imread("characterC_original.png");
// this is the image with the character only. In 8UC3 type too
cv::Mat img = cv::imread("characterC.png");
// this is where the character was placed in original. If you have this informationalready somehwere else, you can use that directly.
int offsetX = 40;
int offsetY = 10;
int width = img.cols;
int height = img.rows;
cv::Mat image = cv::Mat(original.rows, original.cols, original.type());
image.setTo(cv::Scalar::all(255));
for(int j=0;j<img.rows;j++)
for (int i=0;i<img.cols;i++)
{
// here you use Vec3b since you have RGB type
image.at<cv::Vec3b>(j+offsetY,i+offsetX)=img.at<cv::Vec3b>(j,i);
}
cv::imshow("original", original);
cv::imshow("char copied", image);
cv::imwrite("characterC_result_8UC3.png", image);
cv::waitKey(-1);
}
我对两者都进行了测试,它们都可以工作。