我目前正在尝试将8位原始彩色图像转换为8位RGB。 我得到一个频道错误,它希望拜耳是一个频道。
我正在使用以下代码。
if (convertBayerChckBox->Checked)
{
try{
cv::Mat temp(imgOriginal.rows, imgOriginal.cols, CV_8UC3);
imgOriginal.copyTo(temp);
cv::cvtColor(temp, imgOriginal, CV_BayerRG2BGR);
}
catch (const cv::Exception& ex)
{
std::cout << "EXCEPTION: " << ex.what() << std::endl;
errLog << "EXCEPTION: " << ex.what() << std::endl;
}
}
然后我得到以下异常: EXCEPTION:...... \ modules \ imgproc \ src \ color.cpp:4194:错误:( - 1515)scn == 1&amp;&amp;函数cv :: cvtColor中的dcn == 3
我不确定如何将拜耳转换为RGB
答案 0 :(得分:3)
您需要将输入Mat的数据指针设置为目标指针。 这是一个将拜耳图像转换为RGB的示例程序。这里我使用了文件中的缓冲区。您可以使用相机帧缓冲区。希望这有帮助!
Mat mSource_Bayer(Size(m_IWidth,m_IHeight),CV_8UC1);
Mat mSource_Bgr(Size(m_IWidth,m_IHeight),CV_8UC3);
FILE *fp = NULL;
uchar *imagedata = NULL;
int framesize = m_IWidth * m_IHeight;
//Open raw Bayer image.
fp = fopen(FileName_S.c_str(), "rb");
//Memory allocation for bayer image data buffer.
imagedata = (uchar*) malloc (sizeof(uchar ) * framesize);
//Read image data and store in buffer.
fread(imagedata, sizeof(uchar ), framesize, fp);
mSource_Bayer.data= imagedata;
fclose(fp);
int Selection= m_BayerFormat.GetCurSel();
if(Selection==0)
cvtColor(mSource_Bayer, mSource_Bgr, CV_BayerBG2BGR);//Perform demosaicing process
else if(Selection==1)
cvtColor(mSource_Bayer, mSource_Bgr, CV_BayerGB2BGR);//Perform demosaicing process
else if(Selection==2)
cvtColor(mSource_Bayer, mSource_Bgr, CV_BayerRG2BGR);//Perform demosaicing process
else if(Selection==3)
cvtColor(mSource_Bayer, mSource_Bgr, CV_BayerGR2BGR);//Perform demosaicing process
imshow("mSource_Bgr",mSource_Bgr);
答案 1 :(得分:0)
此外,为了执行从BAYER到RGB的转换,我建议使用SimdBayerToBgr中的函数Simd Library。看来它的功能要比OpenCV(使用AVX2和AVX-512)的同类产品要快。