在opencv中复制Mat

Rob*_* Vn 6 c++ opencv mat

我尝试使用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_8UC3CV_8UC4仅使用克隆功能复制棒.


Mik*_*iki 5

您实际上不想复制数据,因为您从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)