另一个进程名为fifo

时间:2015-12-19 01:24:38

标签: c++ linux opencv systems-programming

您好我正在尝试模拟客户端 - 服务器程序。它们都是独立的进程。客户端侦听由服务器写入名为fifo 的图像数据(mat.data)(读取图像)来自网络摄像头的帧并在namedfifo上逐一写入 我的服务器和客户端工作完美,如果我在客户端创建一个简单的mat对象,将其写在fifo上,在服务器上读取它并在服务器端重新创建它。但是,当我尝试写一个连续的流帧 从网络摄像头,服务器提供核心转储,分段故障。

服务器端代码如下所示。

     #include <stdio.h>
     #include <opencv2/opencv.hpp>
     #include <opencv2/core/core.hpp>
     #include <iostream>
     #include <stdlib.h>
     #include <sys/types.h>
     #include <sys/stat.h>
     #include <fcntl.h>
     #include <unistd.h>
     int main(int, char**)
     {
      VideoCapture cap(0); // open the default camera
      if(!cap.isOpened())  // check if we succeeded
       return -1;

      int check;
      int fd;
      int totalbytes;
      int buflen;

      fd = open("/home/vidfifo",O_WRONLY|O_NONBLOCK);

      for(;;)
      {
        Mat frame;
        cap >> frame; // get a new frame from camera

        int  totalbytes = frame.total()*frame.elemSize();
        int buflen = frame.cols*3;

        check = writefifo(frame.data,totalbytes,buflen,fd);

        if (check == 1)
        {
          cout<<"write successful"<<endl;
          imshow("frames1", frame);
          if(waitKey(30) >= 0) break;
        }
        else
        {
          break;
        }
    }
       close(fd);
       return 0;
    }

writefifo 功能如下

    int writefifo(uchar *framepointer,int totalbytes,int buflen,int fd)
    {
      uchar* buf;
      buf = framepointer;
      int num = totalbytes/buflen;
      for(int i = 1;i<=num;i++)
      {
        write(fd,buf,buflen);
        buf = buf + buflen;
      }
      return 1;
     }

客户端方面是

    #include <stdio.h>
    #include <opencv2/opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <iostream>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    int main( int argc, char** argv )
    {
      //I found these by running the server program beforehand          
      int rows = 480;
      int cols = 640;
      int nchan = 3;
      int totalbytes = 921600;//rows*cols*nchan
      int buflen = 1920;//cols*nchan

      while(1)
      {
         Mat img(rows,cols,CV_8UC3);
         uchar buf[buflen];
         uchar datarray[totalbytes];

         int fd1 = open("/home/vidfifo",O_RDONLY);
         int j;
         int k = 0;
         int num = totalbytes/buflen;//=num of rows

         for(int i = 1;i<=num;i++)
         {
           read(fd1,buf,buflen);
           for ( j = 0 ; j<= (buflen-1);j++ ) //originally wrote this as j<= (buflen-1+k)--see update1 at the end of post
           {
              datarray[j+k] = buf[j];

           }
              k = k+buflen;
           }

           img.data = datarray;
           imshow("framesrec", img);
           if(waitKey(30) >= 0) break;
     }
            return 0;
     }

我知道服务器程序中的指针有问题。但我无法弄清楚是什么。 请告诉我代码中是否存在与指针相关的问题或其他不允许客户端接收连续帧流的问题。 谢谢。

在发布这个问题之后

update1 ,我意识到我应该把读取循环的限制(在服务器中)写为 j&lt; =(buflen -1)而不是 j&lt; =(buflen-1 + k)。这删除了分段错误,但我得到的是一个损坏的冻结帧而不是连续流,并且窗口在一段时间后停止响应。所以,现在,我的问题是如何获得连续流?

在服务器代码中将关闭系统调用外部循环放入

update2 之后,我现在得到一个连续的流,但它很模糊,框架看起来被压扁了。但不是一个完美的流。

0 个答案:

没有答案