Привет я пытаюсь смоделировать клиент-серверную программу. Оба являются независимыми процессами. Клиент прослушивает данные изображения (mat.data), записанные на названный FIFO сервером (который читает кадры изображения с веб-камеры и записывает их один за другим в 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<= (buflen -1) вместо J<= (Buflen-1 + к).Это устранило ошибку сегментации, но все, что я получаю, это поврежденный замороженный кадр вместо непрерывного потока, и окно перестает отвечать через некоторое время. Итак, теперь мой вопрос: Как получить непрерывный поток?
Update2 после помещения в системный код закрытого системного вызова вне цикла, теперь я получаю непрерывный поток, но он размыт, и кадры выглядят раздавленными. До сих пор не идеальный поток.
Задача ещё не решена.
Других решений пока нет …