Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GigE摄像头/MIL库-部分图像被剪切_C++_Image Processing_Computer Vision - Fatal编程技术网

C++ GigE摄像头/MIL库-部分图像被剪切

C++ GigE摄像头/MIL库-部分图像被剪切,c++,image-processing,computer-vision,C++,Image Processing,Computer Vision,我目前正在开发一个软件,该软件使用GigE摄像机记录光谱,并对光谱进行分析。但由于这种分析非常耗时,部分分析已经在FPGA上完成。相机的一条记录的格式为320 x 256 320光谱,分辨率为256px。FPGA获取该记录并将其与256 x 1矩阵相乘,因此最终结果是320 x 1矩阵。这个结果是一个列向量,它将精确地适合维度。但不幸的是,它显示为一个行向量,因此从256开始,所有内容都被剪切。 因此,我尝试将宽度标注设置为不同: MdigControl(MilDigitizer, M_SOU

我目前正在开发一个软件,该软件使用GigE摄像机记录光谱,并对光谱进行分析。但由于这种分析非常耗时,部分分析已经在FPGA上完成。相机的一条记录的格式为320 x 256 320光谱,分辨率为256px。FPGA获取该记录并将其与256 x 1矩阵相乘,因此最终结果是320 x 1矩阵。这个结果是一个列向量,它将精确地适合维度。但不幸的是,它显示为一个行向量,因此从256开始,所有内容都被剪切。

因此,我尝试将宽度标注设置为不同:

MdigControl(MilDigitizer, M_SOURCE_SIZE_X, 320);
但是我得到一个错误,因为相机的高度和宽度属性是只读的。 有趣的是,当使用Pleora Technologies提供的免费版本的eBus播放器时,它是有效的!我得到的结果是1 x 320。

有人能帮忙吗

多谢各位

编辑: 以下代码显示图像的分配和显示

MappAlloc(M_DEFAULT, &MilApplication);
MsysAlloc(M_SYSTEM_GIGE_VISION, M_DEV0, M_DEFAULT, &MilSystem);
MdispAlloc(MilSystem, M_DEFAULT, MIL_TEXT("M_DEFAULT"), M_WINDOWED, &MilDisplay);
MdigAlloc(MilSystem, M_DEV0, MIL_TEXT("M_DEFAULT"), M_DEFAULT, &MilDigitizer);
MbufAllocColor(MilSystem, 3, 320, 1, 8+M_UNSIGNED, M_IMAGE+M_GRAB+M_DISP, &MilImageRGB);

unsigned char *testArray = new unsigned char[320*3];
MdigGrab(MilDigitizer, &MilImageRGB);

// Print values
MbufGetColor(MilImageRGB, M_PLANAR, M_ALL_BANDS, testArray);
for(int counterColorBand = 0; counterColorBand < 3; counterColorBand++)
{
  for(int counterPosition = 0; counterPosition < 320; counterPosition++)
  {
    std::cout << counterColorBand*320 + counterPosition << "-" << static_cast<unsigned>(testArray[counterColorBand * 320 + counterPosition]) << "\t";
  }
  std::cout << "\n\n";
}

//Display image
MdispSelect(MilDisplay, &MilImageRGB);

我通过与Matrox客户服务联系找到了问题的解决方案,我想我会让您知道: 问题是,在我实际接收数据之前,它存储在一个内部内存中,该内存使用320x256px的维度。通过一些代码可以避免这种情况:

MIL_INT64 Format = 0;
MdigInquire(MilDigitizer, M_SOURCE_BUFFER_FORMAT, &Format)
...
MbufAllocColor(…, 3, 1, 320, 8+M_UNSIGNED, M_IMAGE+M_GRAB+Format, …);

您使用什么SDK从相机获取图像?您可能还需要在问题中包含更多代码。我使用的是MIL Lite 9.00 R2+64位。我添加了更多的代码。那么您遇到的问题纯粹是在计算矩阵的显示上吗?因为我没有看到您在添加的代码块中提到的原始代码行。在显示之前旋转它不是一个选项吗?是的,第一行代码不在那里,因为它会导致错误。下面的代码生成1 x 256的图像,尽管缓冲区分配了1 x 320,因为MIL只记录320 x 256的图像,所以它只取出1 x 256的第一行。遗憾的是,旋转不是一个选项,因为它改变了矩阵乘法:320 x 256*256 x 1有效,256 x 320*256 x 1无效