尝试在 C 上编写 UDP 流网络摄像头服务



伙计们。

我不完全确定我应该如何通过 UDP 数据报发送编码的图像。建立 UDP 服务后,我将运行此循环:

服务器端:

FrameCapture = cvCaptureFromCAM(-1);
frameORG = cvQueryFrame(FrameCapture);  
small = cvCreateImage(cvSize(frameORG->width / 2, frameORG->height / 2), frameORG->depth, 3);   
while((cvWaitKey(40) & 0xFF) != ESC_KEY)
{
    frameORG = cvQueryFrame(FrameCapture);
    VideoBuffer = cvEncodeImage(bufUDP, &small, 0);
    memcpy(bufUDP, VideoBuffer, UDPMAX);
    if (sendto(sockUDP, bufUDP, strlen(bufUDP), 0, (struct sockaddr *)&servUDP, length) < 0)
    {
        if (errno == EPIPE)
        {
            printf("Connection lost.);
        }
        else
        {
            perror("Transmission failed.");
        }
        exit(1);
    }
}

客户端:

bufUDP = (char*) malloc(UDPMAX);
VideoBuffer = (CvMat *) malloc(UDPMAX);
cvNamedWindow("UDP Streaming from Server", CV_WINDOW_AUTOSIZE);
while ((cvWaitKey(40) & 0xFF) != ESC_KEY) 
{
    if (recvfrom(sockUDP, bufUDP, strlen(bufUDP), 0, (struct sockaddr *)&servUDP, &length) < 0)
    {
        if (errno == EPIPE)
        {
            printf("Connection lost.n");
        }
        else
        {
            perror("Problem recieving data.");
        }
        exit(1);
    }
    memcpy(VideoBuffer, bufUDP, UDPMAX);
    img = cvDecodeImage(VideoBuffer,CV_LOAD_IMAGE_COLOR);
    cvShowImage("UDP Video Receiver", &img);
}

该程序在没有任何警告的情况下编译(使用 -Wall),但服务器端的输出是 OpenCV 函数的例外。

OpenCV 错误:cvarrToMat 中的参数错误(未知数组类型),文件/../../../../../../../矩阵.cpp,第 698 行 在抛出"cv::异常"实例后终止调用 什么():/../../../../../../../matrix.cpp:698:错误:(-5) 函数 cvarrToMat 中的数组类型未知

我不完全确定我应该如何处理计时,所以我尝试每 40 毫秒 (25fps) 发送一次数据包。

提前致谢

我终于自己找到了答案。希望这对任何与UDP + OpenCV + CapturefromCAM作斗争的人有所帮助。cvEncodeImage 和 cvDecodeImage 的整个使用并不是真正必要的。由于结构 IplImage 已经将其数据保存在 image->imageData 中。因此,以下代码:

服务器端:

cvNamedWindow("Webcam from Server", CV_WINDOW_AUTOSIZE);
FrameCapture = cvCaptureFromCAM(0); 
frameORG = cvQueryFrame(FrameCapture);  
small = cvCreateImage(cvSize(frameORG->width, frameORG->height), frameORG->depth, 3);
if(!FrameCapture) {
    printf("Could not iniciate webcamn");
    return;
}
while((cvWaitKey(40) & 0xFF) != ESC_KEY)
{
        small = cvQueryFrame(FrameCapture);                                     
        for(times = 0; times < MAX_PAQS; times++)
        {
            memset(bufUDP, 0, UDPMAX);
            memcpy(bufUDP, small->imageData + UDPMAX*times, UDPMAX);
            if (sendto(sockUDP, bufUDP, UDPMAX, 0, (struct sockaddr *)&servUDP, length) < 0)
            {
                // check errno for the problem or conection lost
            }
        }
    }
    cvShowImage("Webcam from Server", small); // feedback on server webcam
}

客户端:

cvNamedWindow("UDP Streaming from Server", CV_WINDOW_AUTOSIZE);
img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
while((cvWaitKey(40) & 0xFF) != ESC_KEY)
{
    for(times = 0; times < MAX_PAQS; times++)
    {
        if (recvfrom(sockUDP, bufUDP, UDPMAX, 0, (struct sockaddr *)&servUDP, &length) < 0)
        {
                // check errno for the problem or conection lost
        }
        memcpy(img->imageData + UDPMAX*times, bufUDP, UDPMAX);
    }
    cvShowImage("UDP Streaming from Server", img);
}

请注意,这里没有帧同步(我没有复制该部分)。UDPMAX 必须保持等于宽度高度通道/MAX_PAQS的数量。如您所见,我使用了 640*480-3 通道帧。

相关内容

  • 没有找到相关文章

最新更新