1

我在互联网上搜索了将近 2 天的解决方案,但我发现的解决方案似乎不适用于我的计算机。

我正在使用什么:

  • Matrox Vio DUO
  • OpenCV 2.4.5
  • MIL-lite
  • Ubuntu 10.04

我已经尝试过您可以在此处找到的 cvcap_mil.cpp 文件。

此代码也不适用于我的项目:

   IplImage* rgb_frame;
   rgb_frame = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 3 );
   MilImage = MbufAllocColor(MilSystem, 3, w, h,8+M_UNSIGNED,M_IMAGE + M_GRAB,M_NULL);
   MbufGetColor(MilImage, M_BGR24+M_PACKED, M_ALL_BAND, (void*)(rgb_frame->imageData));
   rgb_frame->origin = IPL_ORIGIN_BL;
   cvFlip(rgb_frame,rgb_frame,0);

你知道怎么做吗?

PS:我的 Matrox Vio 卡工作正常。

编辑:我找到了一种获取黑白图像的方法。以下是感兴趣的人的解决方案:

MIL_ID MilApplication, /* Application identifier */
MilSystem, /* System identifier */
MilDigitizer, /* Digitizer identifier */
MilImageRGB, /* RGB Buffer */
MilImage1Child, /* R child */
MilImage2Child, /* G child */
MilImage3Child; /* B child */

//init
MappAlloc(M_DEFAULT,&MilApplication);
MsysAlloc(M_SYSTEM_VIO,M_DEFAULT,M_DEFAULT,&MilSystem);

MdigAlloc(MilSystem,M_DEFAULT,MIL_TEXT("M_DEFAULT"),M_DEFAULT,&MilDigitizer);

/*get width & height of cam*/
long width = MdigInquire(MilDigitizer,M_SIZE_X,M_NULL);
long height = MdigInquire(MilDigitizer,M_SIZE_Y,M_NULL);
MbufAllocColor(MilSystem,3,width,height,8+M_UNSIGNED,M_IMAGE+M_GRAB+M_PROC+M_DISP,&MilImageRGB); /*Erster Buffer*/

/*first Child (r channel)*/

MbufChildColor2d(MilImageRGB,M_RED, 0, 0, width , height ,&MilImage1Child);
MbufChildColor2d(MilImageRGB,M_GREEN, 0, 0, width , height ,&MilImage2Child); /*second Child (g channel)*/
MbufChildColor2d(MilImageRGB,M_BLUE, 0, 0, width , height ,&MilImage3Child); /*third Child (b channel)*/
IplImage *pIplImgProcessed = cvCreateImage ( cvSize ( width,height ), 8,1 );

/* get one image */
MdigGrab(MilDigitizer, MilImageRGB);


/*copy first child to buffer*/
MbufGet ( MilImage1Child, pIplImgProcessed->imageData );



// Visualise in a Qt label
Mat src(pIplImgProcessed);
QImage qImage = Mat2QImage(src);
QPixmap pixmap = QPixmap::fromImage(qImage);
ui->label_2->clear();
ui->label_2->setPixmap(pixmap.scaled(ui->label_2->size()));


//release
MdigFree(MilDigitizer);
MbufFree(MilImage1Child);
MbufFree(MilImage2Child);
MbufFree(MilImage3Child);
MbufFree(MilImageRGB);
MsysFree(MilSystem);
MappFree(MilApplication);

谢谢您的帮助。蒂博。

4

2 回答 2

0

以下是您应该检查的几件事。

  1. cvCreateImage 真的需要 BGR24+Packed 缓冲区吗?也许它是 BGR32+Packed 或 BGR24+Planar...我正在使用 EmguCV,所以我不习惯 OpenCV 中的这个功能。
  2. 确保您使用 MbufGetColor() 获得的数据与您的 OpenCV 缓冲区具有相同的间距(对齐属性)。
  3. 您在示例中提供的代码甚至没有抓取,但我想您是在真实代码中执行此操作。由于您的缓冲区似乎半满(垃圾+绿色),我认为您一次可能只抓取一个字段(2 个字段 = 1 帧)
  4. 您应该尝试清除缓冲区并交替使用 OpenCV 和 MIL 在 (0, 1) 处设置一个白色像素,以查看它们是否出现在图像中的同一位置。
于 2013-05-31T12:04:26.097 回答
0

您可以在 MIL 中创建 RGB 图像的红色、绿色和蓝色子缓冲区。然后让 OpenCV 指向每个缓冲区,就好像它们是三个单独的灰色图像一样。最后,在 OpenCV 中,您可以将这三个通道合并为一个 OpenCV 彩色图像。

于 2016-02-18T22:35:05.070 回答