我正在尝试连接panasonic d-imager以打开简历

时间:2011-03-11 12:29:13

标签: opencv

我是OpenCV的新手,我正在尝试展示" panasonic d-imager"在使用OpenCV的屏幕上的3d照相机。到目前为止没有成功。

我得到包含以下功能的DLL文件

// This function connects the personal computer to the 3D Image Sensor, and sets up the system to acquire images from the sensor.
InitImageDriver(); 

//This function obtains the image data from the camera via the USB driver, and copies the range image data and grayscale image data to the area given by the argument. kdat and ndat=Pointer of the range and grayscale image data acquiring buffer.Always secure the range image storage area using the application program. The size of the range image data storage area should be: 160’ 120 ‘2 = 38400 bytes.    
int WINAPI GetImageKN(unsigned short *kdat ,unsigned short *ndat);

现在我只想在屏幕上显示两个摄像头输出(彩色和灰度)。我写了这段代码:

#include
#include
#include "Dimagerdll.h" //the hader file

#pragma comment(lib,"Dimagerdll.lib") // the lib file of dll
using namespace std;

int main(int argc, char *argv[])
{
    IplImage *img;
    unsigned short *r= new  unsigned short[38400];
    unsigned short  *t= new  unsigned short[38400];

    InitImageDriver(); //dll function
    GetImageKN(r,t); //dll function

    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);//create a window to display the images
    cvMoveWindow("mainWin", 5, 5);// position the window

    while(1)
    {
        img=cvQueryFrame(r);// retrieve the captured frame-but here is the problem! r is unsigned short so it cant compile!!!!!
        cvShowImage("mainWin", img );// show the image in the window

        c=cvWaitKey(10);
        if(c == 27)
        break;
    }

    FreeImageDriver();//dll function
    return 0;
}

很明显,我无法使用cvQueryFrame,因为来自相机的数据不是IplImage

有人能告诉我还有什么需要做的吗?

感谢

2 个答案:

答案 0 :(得分:2)

你是对的,你不能使用cvQueryFrame,这适用于有特殊网络摄像头驱动程序的摄像头。因此,您似乎了解了与相机接口并从中获取数据的API;剩下要做的就是将数据转换为IplImage,如果您愿意,可以对其进行一些处理,如果您愿意,可以显示图像,并循环显示您以所需帧速率接收的帧。

因此,您获得的图像是编码的(例如JPEG格式),还是获得像素值(如果是8位,则为0-255)。如果对图像数据进行编码,则必须知道使用何种类型的编码并使用一种类型的库进行解码。例如,我使用LibJPEG Turbo解码尼康和佳能相机的JPEG数据。

假设您解码了图像,或图像未编码,您将必须了解有关图像的一些细节。高度和宽度(以像素为单位),位深度(通常为每像素8位)和通道数(RGB颜色为3,灰度为1)。

让我们假设图像是每像素8位,高度h,宽度w,并且是灰度。

首先为新图像分配内存 IplImage * frame = cvCreateImage(cvSize(w,h),8,1);

然后,在你的循环中:

while(getImages) {

 // obtain 1-D array of Row-Wise 8 bit pixel values from camera API and decoding if necessary
 frame->imageData = pointer to pixel values

 // process if you want
 // display if you want

}

cvReleaseImage(&frame)

确保在循环的每次迭代中不重新分配内存,只需执行一次,并且在程序结束之前保持良好并释放帧

答案 1 :(得分:1)

除了rossb83的优秀答案之外 - 如果您从相机获取灰度数据,则必须将其转换为8UC3(8位三通道)以使用showWindow进行显示。请参阅cvtColor或使用原始像素访问自行完成。