2011-10-12 181 views
3

我试图将从Basler相机捕获的帧转换为OpenCV的Mat格式。没有很多的来自巴斯勒API文档的信息,但这些都是在巴斯勒例子中,两行应在确定什么是有用的输出格式为:将Basler图像转换为OpenCV

// Get the pointer to the image buffer 
const uint8_t *pImageBuffer = (uint8_t *) Result.Buffer(); 
cout << "Gray value of first pixel: " << (uint32_t) pImageBuffer[0] << endl << endl; 

我知道像什么格式是(目前设置为单声道8位),并尝试过:

img = cv::Mat(964, 1294, CV_8UC1, &pImageBuffer); 
img = cv::Mat(964, 1294, CV_8UC1, Result.Buffer()); 

两者都不起作用。任何建议/意见将不胜感激,谢谢!

编辑:我可以通过访问像素巴斯勒图像:

for (int i=0; i<1294*964; i++) 
    (uint8_t) pImageBuffer[i]; 

如果它转换为OpenCV中的垫格式帮助。

+0

你是什么意思,它不起作用?它是否会崩溃,或者您是否获得了图案图像(即,您关闭了几行或几列甚至是几个通道)?你可以发布输出吗?它看起来像使用1294x964的全帧参数。这些真正有效的行是由Basler返回的,还是它们是前/后有效的行,它是1280x960?相机是提供分色输出还是单色? – mevatron

+0

嗨,代码编译和运行,但如果我尝试使用'cv :: imshow()'显示图像,我得到一个错误窗口弹出说“basler_camera.exe已停止工作”。 1294 * 964是相机的最高分辨率,因此是正确的。我相信问题是从'pImageBuffer'复制到'img',但不知道如何正确执行。 –

回答

6

您正在创建cv图像以使用相机的内存 - 而不是拥有自己内存的图像。问题可能是相机正在锁定该指针 - 或者可能希望重新分配并将其移动到每个新图像上

尝试创建没有最后一个参数的图像,然后使用memcpy将像素数据从相机复制到图像()。

// Danger! Result.Buffer() may be changed by the Basler driver without your knowing   
const uint8_t *pImageBuffer = (uint8_t *) Result.Buffer(); 

// This is using memory that you have no control over - inside the Result object 
img = cv::Mat(964, 1294, CV_8UC1, &pImageBuffer); 

// Instead do this 
img = cv::Mat(964, 1294, CV_8UC1); // manages it's own memory 

// copies from Result.Buffer into img 
memcpy(img.ptr(),Result.Buffer(),1294*964); 

// edit: cvImage stores it's rows aligned on a 4byte boundary 
// so if the source data isn't aligned you will have to do 
for (int irow=0;irow<964;irow++) { 
    memcpy(img.ptr(irow),Result.Buffer()+(irow*1294),1294); 
} 
+0

嗨,你能提供一个你的意思吗?谢谢 –

+0

感谢您的代码。不幸的是,这似乎不起作用,因为图像不被复制。 (int i = 0; j (i,j)=((int i = 0; i

+1

你有'memcpy'参数错误的方式。它应该是'memcpy(img.ptr(),Result.Buffer(),basler_width * basler_height)'。函数定义是'memcpy(目标,源,长度)。 – misha