使用opencv3.0以及opencv3.0之前的版本, cv::split总是报错,没有去看源代码,因为split实现的功能比较简单,所以自己写了一个备用。
bool Split2BGR(const cv::Mat& mSrc, std::vector<cv::Mat>& mBGR)
{
const int nChannels = mSrc.channels();
cv::Mat* BGR = new cv::Mat[nChannels];
for (int i = 0; i < nChannels; ++i)
{
BGR[i] = cv::Mat::zeros(mSrc.size(), CV_8UC1);
}
for (int j = 0; j < mSrc.rows; ++j)
{
const uchar* data = mSrc.ptr<uchar>(j);
for (int i = 0; i < mSrc.cols; ++i)
{
for (int c = 0; c < nChannels; ++c)
{
BGR[c].at<uchar>(j, i) = data[i * nChannels + c];
}
}
}
if (nChannels >= 3)
{
//重新按照RGB的顺序排列
mBGR.push_back(BGR[2]);
mBGR.push_back(BGR[1]);
mBGR.push_back(BGR[0]);
if (nChannels >= 4)
{
//alpah通道在最后
mBGR.push_back(BGR[3]);
}
}
if (BGR)
{
delete[] BGR;
BGR = nullptr;
}
return true;
}