14

我正在尝试将 3 通道图像更改为 4 通道,如下所示:

cv::VideoCapture video;
video.open("sample.avi");
cv::Mat source;
cv::Mat newSrc;
int from_to = { 0,0, 1,1, 2,2, 3,3 };
for ( int i = 0; i < 1000; i ++ )
{
   video >> source;
   cv::mixChannels ( source, 2, newSrc, 1, from_to, 4 );
}

然后我得到了

too many input arguments in function call

对于“mixChannels”行。此外,我不确定我是否为我的目标正确地给出了论据。有人能帮我吗?谢谢你。

4

3 回答 3

17

您可以将 3 通道图像转换为 4 通道,如下所示:

cv::Mat source = cv::imread(path);

cv::Mat newSrc(source.size(), CV_MAKE_TYPE(source.depth(), 4));

int from_to[] = { 0,0, 1,1, 2,2, 2,3 };

cv::mixChannels(&source,1,&newSrc,1,from_to,4);

这样,通道 4 将成为通道 3 的副本。通过在列表中使用负数from_to,输出通道被零填充。例如:

int from_to[] = { 0,0, 1,1, 2,2, -1,3 };
于 2012-11-19T12:19:21.373 回答
7

第 4 个频道应该包含什么?怎么样:

VideoCapture cap(0);
Mat frame;
cap >> frame;

Mat RGBA(frame.size(), CV_8UC4, camData);
cv::cvtColor(frame, RGBA, CV_BGR2RGBA, 4);
于 2012-11-19T10:39:46.243 回答
7

我认为应该是这样的:

cv::Mat source = cv::imread(path);
cv::Mat newSrc = cv::Mat(source.rows,source.cols,CV_8UC4);

int from_to[] = { 0,0, 1,1, 2,2, 3,3 };
cv::mixChannels(&source,1,&newSrc,1,from_to, source.channels());

在 C++11 中,您可以使用初始值设定项列表为内联批量转换提供多个矩阵:

cv::mixChannels({{source}}, {{newSrc}}, from_to, source.channels());

我们设置了 3 对要复制,所以这使得 newsrc 中的 4 通道为空。第二个和第四个参数中的 1 表示指针 source 和 newSrc 指向一个要处理的元素。最后一个参数给出 from_to 的长度。

于 2015-02-24T10:11:56.647 回答