通过D2XX库或OPENCV

时间:2015-09-12 07:21:43

标签: c++ qt opencv ftdi d2xx

我想编写一个应用程序(用c ++编写),以便从采集系统中使用的摄像头捕获图像。相机连接到一个盒子(采集系统),我发现使用的芯片是FTDI。芯片位于相机和PC之间的盒子中。相机已连接到此盒子。 USB电缆连接到PC和盒子。其他一些工具连接到盒子上并不重要。

此外,还有一个由MFC编写的简单商业应用程序,我想做同样的事情。在应用程序的文件夹中有D2XX驱动程序文件(ftd2xx.h等)和相机的信息文件(* .inf)。

此外,相机不是录制视频,而是以短间隔(<0.1秒)拍摄照片,间隔由采集系统而非商业应用程序确定(采集系统检测相机何时拍摄照片)

这是我的问题:

由于提供了USB设备的信息文件,我是否可以利用Open-CV lib来捕获摄像头,还是只需要使用D2XX库?

如果我必须使用D2XX库来读取数据,我怎么能将原始数据转换为图像格式(在Qt中)?

我不能一遍又一遍地在设备上编写应用程序和测试以找到解决方案,因为设备位于远离我的位置,并且每次测试我都必须行进这个距离。所以,我想确保我的应用程序能够正常运行。

来自中国的公司为我们制造了这个设备,他们不再支持它了:(

1 个答案:

答案 0 :(得分:1)

要转换为图片,请尝试以下操作:

Mat hwnd2mat(HWND hwnd){

HDC hwindowDC, hwindowCompatibleDC;

int height, width, srcheight, srcwidth;
HBITMAP hbwindow;  // <-- The image represented by hBitmap
cv::Mat src;  // <-- The image represented by mat
BITMAPINFOHEADER  bi;

// Initialize DCs
hwindowDC = GetDC(hwnd);   // Get DC of the target capture..
hwindowCompatibleDC = CreateCompatibleDC(hwindowDC);  // Create compatible DC
SetStretchBltMode(hwindowCompatibleDC, COLORONCOLOR);

RECT windowsize;    // get the height and width of the screen
GetClientRect(hwnd, &windowsize);

srcheight = windowsize.bottom;
srcwidth = windowsize.right;
height = windowsize.bottom *2/ 2;  //change this to whatever size you want to resize to
width = windowsize.right *2/ 2;

src.create(height, width, CV_8UC4);

// create a bitmap
hbwindow = CreateCompatibleBitmap(hwindowDC, width, height);
bi.biSize = sizeof(BITMAPINFOHEADER);   
bi.biWidth = width;
bi.biHeight = -height;  //this is the line that makes it draw upside down or not
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

// use the previously created device context with the bitmap
SelectObject(hwindowCompatibleDC, hbwindow);
// copy from the window device context to the bitmap device context
StretchBlt(hwindowCompatibleDC, 0, 0, width, height, hwindowDC, 0, 0, srcwidth, srcheight, SRCCOPY); //change SRCCOPY to NOTSRCCOPY for wacky colors !
GetDIBits(hwindowCompatibleDC, hbwindow, 0, height, src.data, (BITMAPINFO *)&bi, DIB_RGB_COLORS);  //copy from hwindowCompatibleDC to hbwindow

// avoid memory leak
DeleteObject(hbwindow); DeleteDC(hwindowCompatibleDC); ReleaseDC(hwnd, hwindowDC);

return src;
}