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

私はそれが次のようであるべきだと思います:

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 つのチャネルは空のままになります。また、2 番目と 4 番目のパラメーターの 1 は、ポインター source と newSrc が処理対象の 1 つの要素を指していることを意味します。最後のパラメーターは、from_to の長さを指定します。

于 2015-02-24T10:11:56.647 に答える
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 に答える