【问题标题】:OpenCV - merge function Exception at memory locationOpenCV - 内存位置的合并功能异常
【发布时间】:2020-08-27 21:36:14
【问题描述】:

我正在尝试将单通道图像合并为一张多通道图像。但它在合并功能处显示错误:

cv::内存位置异常

代码:

#include <vector>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main() {
    Mat input = imread("a jpeg image");
    Mat B, G, R, merged;
    vector<Mat> channels(3), channels2(3);

    //-- split
    split(input, channels);
    B = channels[0];
    G = channels[1];
    R = channels[2];

    //-- merge
    channels2.push_back(B);
    channels2.push_back(G);
    channels2.push_back(R);

    merge(channels2, merged);
    imshow("merged", merged);

    waitKey(0);
    return 0;
}

我在 Windows 上使用 Visual Studio。 我该如何解决这个问题?

附:我的最终目标是将 4 个图像(即蓝色、绿色、色调和灰度)合并为一个 4 通道,并将其用作mean 函数的输入。这适用于 Mat 对象吗?或者第三个通道必须是红色,第四个通道必须是 alpha?

【问题讨论】:

    标签: c++ opencv merge split


    【解决方案1】:

    您声明了两个由 3 元素组成的向量 (size),但不初始化它们的值:

    vector<Mat> channels(3), channels2(3);
    

    这些第一个3 元素的初始值是多少?

    在这之后,你把push_back另一个3元素放到同一个向量中:

    channels2.push_back(B);
    channels2.push_back(G);
    channels2.push_back(R);
    

    所以,channels2 现在有 6 元素。问题来了:data typesize 的所有这些元素都相同吗?如果您想将它们合并在一起,它们必须是!如果您只想合并 BGR 频道,您可以这样做:

    std::vector<cv::Mat> channels2; //Notice I declared an empty vector
    
    //Push the individual channels into the vector:
    channels2.push_back(B);
    channels2.push_back(G);
    channels2.push_back(R);
    
    //Merge the channels
    cv::Mat outputMat;
    cv::merge( channels2, outputMat);
    

    当然,如果您使用初始容量 (size) 和初始值声明向量,则可以使用 std::vector&lt;&gt;::operator[] 来索引每个元素,而不是使用 push_back。要么使用一种方法,但不要混淆它们。

    【讨论】:

    • 非常感谢。向量应该是空的。
    • @HadiGhahremanNezhad 没问题,伙计!我们都怀念小事,快乐编码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2011-10-20
    • 2016-01-23
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多