我尝试使用opencv将图像复制到其他图像,但我遇到了问题.两个图像不一样,像这样:

这是我使用的代码:
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <cmath>
#include <iostream>
#include <opencv2\opencv.hpp>
int main()
{
cv::Mat inImg = cv::imread("C:\\Users\\DUY\\Desktop\\basic_shapes.png");
//Data point copy
unsigned char * pData = inImg.data;
int width = inImg.rows;
int height = inImg.cols;
cv::Mat outImg(width, height, CV_8UC1);
//data copy using memcpy function
memcpy(outImg.data, pData, sizeof(unsigned char)*width*height);
//processing and copy check
cv::namedWindow("Test");
imshow("Test", inImg);
cv::namedWindow("Test2");
imshow("Test2", outImg);
cvWaitKey(0);
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*yan 14
只需使用以下.clone()功能cv::Mat:
cv::Mat source = cv::imread("basic_shapes.png");
cv::Mat dst = source.clone();
Run Code Online (Sandbox Code Playgroud)
这样就可以了.您只使用一个通道制作图像(这意味着只能使用灰色阴影)CV_8UC1,您可以使用CV_8UC3或CV_8UC4仅使用克隆功能复制棒.
您实际上不想复制数据,因为您从RGB CV_8UC3图像开始,并且您想要处理灰度CV_8UC1图像.
您应该使用cvtColor,将RGB数据转换为灰度.
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat inImg = cv::imread("C:\\Users\\DUY\\Desktop\\basic_shapes.png"); // inImg is CV_8UC3
Mat outImg;
cvtColor(inImg, outImg, COLOR_RGB2GRAY); // Now outImg is CV_8UC1
//processing and copy check
imshow("Test", inImg);
imshow("Test2", outImg);
waitKey();
}
Run Code Online (Sandbox Code Playgroud)
简单地说,memcopy你要复制一个这样的序列uchar:
BGR BGR BGR BGR ...
Run Code Online (Sandbox Code Playgroud)
到期望它们的图像(G代表灰色):
G G G G ...
Run Code Online (Sandbox Code Playgroud)
这就是导致你的outImg不正确.
如果您定义outImage如下代码,您的代码将是正确的:
cv::Mat outImg(width, height, CV_8UC3); // Instead of CV_8UC1
Run Code Online (Sandbox Code Playgroud)