c++ - OpenCv 从连续数据数组创建 3 channel Mat

标签 c++ opencv image-processing mat opencv-mat

我想使用分配在其他地方的数据创建一个 OpenCV 3 channel 垫,其中每个 channel 的像素都在一起,这与来自不同 channel 的数据交错的 OpenCV 垫的数据不同。

Mat outputMat = Mat(dimY, dimX, CV_8UC3, rawData); 
// This works only if rawData interleaves channel data like an OpenCv Mat

有没有一种方法可以创建 OpenCV Mat,而不必求助于以下从临时 Mat 中拆分 channel 并将正确的 channel 数据复制到相应位置的解决方案?

void createMat(unsigned char *rawData, unsigned int dimX, unsigned int dimY)
{
    Mat outputMat = Mat(dimY, dimX, CV_8UC3);

    // use outputMat to draw some stuff

    Mat channelR = Mat(dimY, dimX, CV_8UC1, rawData);
    Mat channelG = Mat(dimY, dimX, CV_8UC1, rawData + dimX * dimY);
    Mat channelB = Mat(dimY, dimX, CV_8UC1, rawData + 2 * dimX * dimY);

    std::vector<Mat> channels(3);
    split(outputMat, channels);

    channels[2].copyTo(channelR);
    channels[1].copyTo(channelG);
    channels[0].copyTo(channelB);
}

我需要经常做这个操作,所以我想知道是否有一个解决方案不涉及调用 split()copyTo() 函数时间。

谢谢!

enter image description here

最佳答案

直接使用merge可以避免splitcopyTo

Mat createMat(unsigned char *rawData, unsigned int dimX, unsigned int dimY)
{
    // No need to allocate outputMat here
    Mat outputMat;

    // Build headers on your raw data
    Mat channelR(dimY, dimX, CV_8UC1, rawData);
    Mat channelG(dimY, dimX, CV_8UC1, rawData + dimX * dimY);
    Mat channelB(dimY, dimX, CV_8UC1, rawData + 2 * dimX * dimY);

    // Invert channels, 
    // don't copy data, just the matrix headers
    std::vector<Mat> channels{ channelB, channelG, channelR };

    // Create the output matrix
    merge(channels, outputMat);

    return outputMat;
}

我测试了其他几种方法,但它们的速度较慢。仅作记录,我认为这样会更快,但转置确实很重:

Mat outputMat(3, dimY*dimX, CV_8UC1, rawData);
Mat tmp = outputMat.t();
outputMat = tmp.reshape(3, dimY);
cvtColor(outputMat, outputMat, COLOR_RGB2BGR);

关于c++ - OpenCv 从连续数据数组创建 3 channel Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43183931/

相关文章:

c++ - 返回枚举或通过引用传递枚举?

c++ - 当存在可用的右值构造函数时,为什么会从右值调用类引用构造函数重载?

c++ - 如何使用 UTF-8 编码将 LPWSTR 转换为 char *

python - 对极几何姿态估计 : Epipolar lines look good but wrong pose

c++ - Opencv 中的错误 - 无法将 ‘cv::Mat’ 转换为‘const CvArr*

python - 使用 python 对药片进行雕刻印记检测

c++ - 黑莓 10 中的 Web 服务

c# - 扫描图像 OpenCV 上的文档检测

python - 使用 Python 图像库缩放

matlab - 如何使用matlab平滑图片的边缘