具体内容参考:
链接: https://www.cnblogs.com/grandyang/p/4105725.html.
【说明】
系统:Ubuntu
语言:C++
相机SDK:FlyCapture2
这儿只上代码
int img_rows = img.GetRows(); // 输入的Image的行数 即是 图像的高h
int img_cols = img.GetCols(); // 输入的Image的列数 即是 图像的宽w
unsigned int databuffer = img_cols * img_rows;
unsigned char *Left = new unsigned char[databuffer*3];
unsigned char *Mid = new unsigned char[databuffer*3];
unsigned char *Right = new unsigned char[databuffer*3];
// 定义新的左中右的Image类型 用于存放 分离后的img
Image Temp_left;
Image Temp_mid;
Image Temp_right;
unsigned char *data = img.GetData();
for ( int l = 0; l < databuffer; l++ )
{
// R
Left[3*l] = *data; // L' R
++data; // R->G
Mid[3*l] = *data; // M' R
++data; // G->B
Right[3*l] = *data; // R' R
++data; // B->R
}
unsigned char *data2 = img.GetData();
for ( int l = 0; l < databuffer; l++ )
{
// R
Left[3*l+1] = *data2; // L' G
++data2; // R->G
// if(data) { cout << "3l+1 " << 3l+1 << endl; break;}
Mid[3*l+1] = *data2; // M' G
++data2; // G->B
Right[3*l+1] = *data2; // R' G
++data2; // B->R
}
unsigned char *data3 = img.GetData();
for ( int l = 0; l < databuffer; l++ )
{
// R
Left[3*l+2] = *data3; // L' B
++data3; // R->G
Mid[3*l+2] = *data3; // M' B
++data3; // G->B
// if(data3) break;
Right[3*l+2] = *data3; // R' B
++data3; // B->R
}
嗯。。 这儿你可以写的更简洁一点!
整段代码是对链接文章中“ FlyCapture2中Image类中的数据是以unsigned char类型保存的,而且是按左中右分别存的,我们只需每三个拆分出来分别保存到新的Image变量中,可参见如下pseudo-code:” 这一段文字下方伪代码的实现。其余剩下的都好弄了。
Tips:众所周知单通道的是灰度图,如三通道是灰度图,那RGB三个值是一个数的。
效果图:
不是很明显看不出哪个是左中右,反正分出来了最后。