Поток веб-камеры от родительского процесса к дочернему процессу

Я хочу отправить поток видеокадров с помощью веб-камеры из родительского процесса в дочерний процесс через именованный канал. Родитель отображает отправленные кадры, а дочерний отображает полученные кадры. Я использую openCV 2.4.12 для доступа и отображения видео. кадры в UBuntu 14.04. Однако он отправляет только один кадр и останавливается. Я не могу понять, в чем причина проблемы. Этот код прекрасно работает, если я отправляю одно изображение, но останавливается в первом кадре при попытке отправить поток.

Вот код:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
using namespace cv;
using namespace std;void  ChildProcess(void);                /* child process prototype  */
void  ParentProcess(void);               /* parent process prototype */

int  main()
{

pid_t  pid;

pid = fork();
if (pid == 0)
ChildProcess();
else
ParentProcess();

}

void  ChildProcess(void)
{

int fd2 = open("/home/eelab/vidpipe",O_RDONLY);

for(;;)
{
int rows = 480;
int cols = 640;
int nchan = 3;
int totalbytes = rows*cols*nchan;
int buflen = cols*nchan;
int ret;
//int fd1 = open("/dev/xillybus_read_32",O_RDONLY);

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

int j;
int k = 0;
int num = totalbytes/buflen;
int bread = 0;
while(bread<totalbytes)
{

ret=read(fd2,buf,buflen);
for ( j = 0 ; j<= (ret-1);j++ )
{
datarray[j+k] = buf[j];

}
k = k+ret;
bread = bread+ret;
}

img.data = datarray;

namedWindow( "Received image", WINDOW_AUTOSIZE );
imshow( "Received image", img );
waitKey(0);
}
close(fd2);
}

void  ParentProcess(void)
{

int check;
int fd;
int totalbytes;
int buflen;
int count = 0;
fd = open("/home/eelab/vidpipe",O_WRONLY);
if (fd < 1)
{
perror("open error");
}

VideoCapture cap(0);

for(;;)
{
Mat frame;
cap >> frame;totalbytes = frame.total()*frame.elemSize();
buflen = (frame.cols*3);

uchar *framepointer = frame.data;int bwritten = 0;
int ret;
uchar* buf;
buf = framepointer;
int num = totalbytes/buflen;
while(bwritten<totalbytes)
{
ret = write(fd,buf,buflen);
write(fd,NULL,0);
buf = buf + ret;
bwritten = bwritten+ret;
}namedWindow( "Sent image", WINDOW_AUTOSIZE );
imshow( "Sent image", frame );
waitKey(0);

}

close(fd);

}

Пожалуйста, помогите, как я могу получить непрерывный поток?

0

Решение

waitKey(0); заблокирует процесс, пока не будет нажата клавиша. Если вы измените на waitKey(1); это будет продолжаться автоматически после >= 1 ms, Если это не достаточно быстро (например, ваш fps очень высок), вам следует переключиться на другую библиотеку GUI (например, Qt).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]