Форум программистов, компьютерный форум, киберфорум
C++: OpenCV
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26

Передача видео с камеры клиенту OPENCV

20.03.2023, 11:08. Показов 15545. Ответов 15

Студворк — интернет-сервис помощи студентам
Доброе время суток. Я новичок в OpenCV. У меня стоит задача, написать программу клиент-сервер, которая будет записывать видео в буфер, до тех пор, пока не подключится клиент к камере, и дальше передать этот буфер с видео ему через TCP IP Я написал код, но он передает лишь 1 кадр. Мне нужно как-то определить размер массива или изменить алгоритм передачи ( сейчас он реализуется с помощью функции SEND).

Сервер(на видеокамере):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int c,new_socket;
std::vector<uchar> arrak;
int main()
{
    int sock,listener;
    std::vector<uchar> buf;
    std::vector<int> params(2);
    params[0] = cv::IMWRITE_PNG_COMPRESSION;
    params[1] = 10;
    struct sockaddr_in addr,client;
 
 
    sock = socket(AF_INET, SOCK_STREAM, 0);// подключение по сокету
    if(sock < 0){
        perror("socket");
        exit(1);
    }
    fcntl(sock, F_SETFL, O_NONBLOCK);
 
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);// подключается к любому ip
 
     if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding faild!");
        exit(2);
    }
     Mat frame;
     int bbytee;
     int imgSize = frame.total() * frame.elemSize();
    // int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала
     frame = Mat::zeros(1080, 1920, CV_8UC3); // заполнение нулями массива frame
listen(sock, 1); // прослушивание подключений
while (true){
     c = sizeof(struct sockaddr_in); // размер структуры
puts("Waiting for incoming connections...");
new_socket = accept(sock, (struct sockaddr *)&client,(socklen_t*)&c);
if(new_socket==-1) //принятие подключения и создания по него нового сокета
     {
         puts("Connection NO NO NO NO  accepted");
         cout << "new_socket = " << new_socket << "\n";
 
 
    cout << "before open the cam" << endl;
    cout << "IDET ZAPIS!" << endl;
    VideoCapture cap(2); // захват видеокамеры
 
    if(!cap.isOpened()) { // проверка условий подключения
        cout<< "Could not open the camera" <<  endl;
        close(sock);
        return -1;
    }
 
 
    int cnt=0;
 
        cap >> frame;// передача кадра с cap в frame
 
        /*if (frame.isContinuous()) {
          // array.assign(mat.datastart, mat.dataend); // <- has problems for sub-matrix like mat = big_mat.row(i)
          arrak.assign(frame.data, frame.data + frame.total()*frame.channels());
        } else {
          for (int i = 0; i < frame.rows; ++i) {
            arrak.insert(arrak.end(), frame.ptr<uchar>(i), frame.ptr<uchar>(i)+frame.cols*frame.channels());
          }
        }
        cout<<"VECTOR: "<<arrak[1]<<endl;
*/
        if(frame.empty()) {
            cerr<<"[client] VideoCapture(0) error!"<<endl;
        }
 
        cv::imencode(".jpg", frame, buf, params);
        cout<< ++cnt << ":"<< frame.isContinuous()<<"," <<frame.size()<<endl;;
 
    }
else {
    while (true){
        int p=sizeof(frame)/sizeof(frame.data[0]);
        printf("BUFF 1: %d\n",buf[1]);
        printf("BUFF 2: %d\n",buf[2]);
        break;
        //cout <<"CONNECT ! CONNECT ! CONNECT !";
        cout << " Frame size : "<<frame.size()<<endl;
        if( (bbytee = send(new_socket, frame.data, imgSize, 0)) ==-1) {//передача данных в сокет
                        cerr<< "bytes = " << bbytee << endl;
                        break;
                    }
    }
    break;
}
}
cout<< "KONESSSSSSSSSS "<<endl;
if (frame.isContinuous()) {
         // array.assign(mat.datastart, mat.dataend); // <- has problems for sub-matrix like mat = big_mat.row(i)
         arrak.assign(frame.data, frame.data + frame.total()*frame.channels());
       } else {
         for (int i = 0; i < frame.rows; ++i) {
           arrak.insert(arrak.end(), frame.ptr<uchar>(i), frame.ptr<uchar>(i)+frame.cols*frame.channels());
         }
       }
       cout<<"VECTOR: "<<arrak[1]<<endl;
cout <<"END"<<endl;
    close(sock);//закрытие сокета
    return 0;
}
Клиент(на ПК):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
    int sock;
    struct sockaddr_in addr;
 
 
sock = socket(AF_INET, SOCK_STREAM, 0);//открытие сокета
    if(sock < 0){//проверка на открытие
        perror("socket");
        exit(1);
        }
 
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = inet_addr("192.168.3.11");// указано IP платы 
 
 if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){//подключение к плате
        perror("connect");
        exit(2);
    }
 
 
 
 
while(true){
    int num_of_recv_bytes;
    VideoWriter outputVideo;
    Size S = Size((int) 1920,(int) 1080);
    outputVideo.open("receive.avi", VideoWriter::fourcc('H','2','6','4'), 25, S, true);
 
    int imgSize = 1080*1920*3;
    Mat frame = Mat::zeros(1080, 1920, CV_8UC3);//заполнение нулями
    uchar *iptr = frame.data;
    int key;
 
    int cnt=0;
    while(1){
        cout << ++cnt<<endl;
       
        while(key != 'q') {
            if( num_of_recv_bytes = recv(sock, iptr, imgSize, MSG_WAITALL) == -1 ) {// чтение данных из сокета
                cerr << "recv failed, received bytes = " << num_of_recv_bytes << endl;
            }
 
            outputVideo<< frame;
            if (key = waitKey(100) >= 0) break;
        }
        outputVideo.release();
        close(sock);// закрытие сокета
        break;
    }
    return 0;
}
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2023, 11:08
Ответы с готовыми решениями:

Захват видео с камеры. OpenCV
Добрый вечер, форумчане. Возникла проблема с захватом видео. Применяю библиотеку openCV 2.1. С одной камеры (USB) захват видео проходит...

OpenCV запись видео с камеры
В кратце что имеем: Raspberry PI4 + Raspbian buster, gcc8.3, opencv 4.5.0. написан следующий код для сохранения видео с камеры на флеш, но...

OpenCV не может захватить запись видео с камеры
В кратце что имеем: Phytec 8M Mini , gcc8.3, opencv 4.5.0. Написан следующий код для сохранения видео с камеры в файл, но выдает ошибку,...

15
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 13:02
Лучший ответ Сообщение было отмечено konstitycii как решение

Решение

Вот пример кода для клиент-серверной программы на C++, которая записывает видео в буфер до тех пор, пока клиент не подключится к камере, а затем передает этот буфер с видео ему по TCP IP. Этот код использует OpenCV и Boost - Библиотеки Asio. обрати внимание, что это всего лишь пример кода, и его, возможно, потребуется адаптировать к твоему конкретному варианту использования:

Server-side code:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <opencv2/opencv.hpp>
#include <boost/asio.hpp>
 
using namespace cv;
using boost::asio::ip::tcp;
 
int main()
{
    // Start recording video
    VideoCapture cap(0);
 
    if (!cap.isOpened())
    {
        std::cerr << "Error: cannot open camera" << std::endl;
        return -1;
    }
 
    Mat frame;
    std::vector<uchar> buffer;
 
    // Record video to the buffer until the client connects
    while (true)
    {
        cap >> frame;
 
        if (frame.empty())
        {
            std::cerr << "Error: empty frame" << std::endl;
            break;
        }
 
        imencode(".jpg", frame, buffer);
 
        if (buffer.size() > 0)
        {
            break;
        }
    }
 
    // Transfer the buffer with video to the client via TCP IP
    try
    {
        boost::asio::io_service io_service;
        tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 1234));
        tcp::socket socket(io_service);
 
        acceptor.accept(socket);
 
        boost::asio::write(socket, boost::asio::buffer(buffer));
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
 
    return 0;
}
Client-side code:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <opencv2/opencv.hpp>
#include <boost/asio.hpp>
 
using namespace cv;
using boost::asio::ip::tcp;
 
int main()
{
    // Connect to the server
    try
    {
        boost::asio::io_service io_service;
        tcp::resolver resolver(io_service);
        tcp::resolver::query query("localhost", "1234");
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::socket socket(io_service);
 
        boost::asio::connect(socket, endpoint_iterator);
 
        // Receive the buffer with video from the server
        std::vector<uchar> buffer(boost::asio::buffer_size(boost::asio::buffer(socket)));
        boost::asio::read(socket, boost::asio::buffer(buffer));
        Mat frame = imdecode(buffer, IMREAD_COLOR);
 
        // Display the video
        namedWindow("Video", WINDOW_AUTOSIZE);
        imshow("Video", frame);
        waitKey(0);
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
22.03.2023, 14:05  [ТС]
Всем доброе время суток! У меня стоит задача написать программу клиент(ПК)-сервер(видеокамера).Сервер будет записывать видеокадры в Mat Frame, до тех пор пока клиент не подключится к серверу, а дальше прекратить запись и передать клиенту данные.

Я написал программу, но думаю я ошибаюсь насчет frame.data. В этой строке, я хочу реализовать передачу всех кадров, полученных до подключения клиента, а я получаю лишь видео с ОДНИМ кадром.
Гуглил в интернете про поле .data ничего путного не нашел.

bbytee = send(new_socket, frame.data, imgSize, 0);//передача данных в сокет


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int c,new_socket;
std::vector<uchar> arrak;
int i=0,k=0;
int bbytee;
int main()
{
    int sock,listener;
    std::vector<uchar> buf;
    std::vector<int> params(2);
    params[0] = cv::IMWRITE_PNG_COMPRESSION;
    params[1] = 10;
    struct sockaddr_in addr,client;
 
 
    sock = socket(AF_INET, SOCK_STREAM, 0);// подключение по сокету
    if(sock < 0){
        perror("socket");
        exit(1);
    }
    fcntl(sock, F_SETFL, O_NONBLOCK);
 
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);// подключается к любому ip
 
     if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding faild!");
        exit(2);
    }
     Mat frame;
     //int imgSize = frame.total() * frame.elemSize();
    int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала
     frame = Mat::zeros(1080, 1920, CV_8UC3); // заполнение нулями массива frame
listen(sock, 1); // прослушивание подключений
c = sizeof(struct sockaddr_in); // размер структуры
while (true){
puts("Waiting for incoming connections...");
new_socket = accept(sock, (struct sockaddr *)&client,(socklen_t*)&c);
cout<<"New_socket: " << new_socket << endl;
if(new_socket ==-1) //принятие подключения и создания по него нового сокета
     {
         puts("Connection NO NO NO NO  accepted");
         cout << "new_socket = " << new_socket << "\n";
 
 
    cout << "before open the cam" << endl;
    cout << "IDET ZAPIS!" << endl;
    VideoCapture cap(2); // захват видеокамеры
 
    if(!cap.isOpened()) { // проверка условий подключения
        cout<< "Could not open the camera" <<  endl;
        close(sock);
        return -1;
    }
 
 
    int cnt=0;
 
        cap >> frame;// передача кадра с cap в frame
 
 
        if(frame.empty()) {
            cerr<<"[client] VideoCapture(0) error!"<<endl;
        }
i++;
cout << "I: = " << i<<endl;
 
        cout<< ++cnt << ":"<< frame.isContinuous()<<"," <<frame.size()<<endl;;
 
    }
else {
    cout << "POSHLA"<<endl;
    cout << "Nachalo peredachi";
    for(k=0;k<i;k++){
cout<<"Zashel v cikl"<<endl;
        //break;
        //cout <<"CONNECT ! CONNECT ! CONNECT !";
        cout << " Frame size : "<<frame.size()<<endl;
        bbytee = send(new_socket, frame.data, imgSize, 0);//передача данных в сокет
 
    }
    cout << "Konez peredachi";
    break;
}
}
cout<< "KONESSSSSSSSSS "<<endl;
cout <<"END"<<endl;
    close(sock);//закрытие сокета
    return 0;
}
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
23.03.2023, 11:37
Лучший ответ Сообщение было отмечено konstitycii как решение

Решение

Цитата Сообщение от konstitycii Посмотреть сообщение
Я написал программу, но думаю я ошибаюсь насчет frame.data. В этой строке, я хочу реализовать передачу всех кадров, полученных до подключения клиента, а я получаю лишь видео с ОДНИМ кадром.
Так у тебя точно нигде нет таких проблем?:
Одна из возможных причин, по которой ты получаешь только один кадр, заключается в том, что ты не сохраняешь все кадры, полученные сервером до подключения клиента. Вместо этого ты, возможно, перезаписываешь предыдущий кадр последним полученным.

Чтобы решить эту проблему, тебе нужно сохранить все кадры, которые получает сервер, в буфере, а затем отправить все кадры в буфере клиенту при его подключении. Просто у тебя код "пестрит" пробелами и разделениями. Так что смотреть его крайне больно

Вот код на c++ сделал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <opencv2/opencv.hpp>
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
 
using namespace cv;
using namespace std;
 
int main(int argc, char** argv)
{
    // initialize the video capture device
    VideoCapture cap(0);
 
    // create a buffer to store the frames
    vector<Mat> frame_buffer;
 
    // start capturing frames
    while (true)
    {
        // read a frame from the video capture device
        Mat frame;
        cap.read(frame);
 
        // add the frame to the buffer
        frame_buffer.push_back(frame);
 
        // check if a client has connected
        int client_socket = accept(server_socket, (struct sockaddr*)NULL, NULL);
 
        // if a client has connected, send all the frames in the buffer
        if (client_socket >= 0)
        {
            // loop through all the frames in the buffer
            for (auto frame : frame_buffer)
            {
                // send the size of the frame to the client
                int size = frame.total() * frame.elemSize();
                send(client_socket, &size, sizeof(size), 0);
 
                // send the frame data to the client
                send(client_socket, frame.data, size, 0);
            }
 
            // clear the buffer
            frame_buffer.clear();
 
            // stop capturing frames
            break;
        }
    }
 
    // release the video capture device
    cap.release();
 
    return 0;
}
В этом коде мы создаем буфер с именем `frame_buffer` для хранения всех кадров, полученных сервером. Когда клиент подключается, мы перебираем все кадры в буфере и отправляем их клиенту. Сначала мы отправляем клиенту размер фрейма, а затем отправляем сами данные фрейма. Затем мы очищаем буфер и прекращаем захват кадров.

Добавлено через 10 минут
konstitycii, вот твой отредаченный код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
 
using namespace std;
using namespace cv;
 
int c,new_socket;
std::vector<uchar> arrak;
int i=0,k=0;
int bbytee;
 
int main() {
    int sock,listener;
    std::vector<uchar> buf;
    std::vector<int> params(2);
    params[0] = cv::IMWRITE_PNG_COMPRESSION;
    params[1] = 10;
    struct sockaddr_in addr,client;
 
    sock = socket(AF_INET, SOCK_STREAM, 0); // создание сокета
    if(sock < 0) {
        perror("socket");
        exit(1);
    }
    fcntl(sock, F_SETFL, O_NONBLOCK); // установка неблокирующего режима
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY); // подключение к любому IP-адресу
 
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding failed!");
        exit(2);
    }
 
    Mat frame = Mat::zeros(1080, 1920, CV_8UC3); // создание матрицы изображения
    int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала
 
    listen(sock, 1); // прослушивание подключений
 
    c = sizeof(struct sockaddr_in); // размер структуры
 
    while (true) {
        puts("Waiting for incoming connections...");
        new_socket = accept(sock, (struct sockaddr *)&client, (socklen_t*)&c);
        cout << "New_socket: " << new_socket << endl;
        if(new_socket == -1) {
            puts("Connection not accepted");
            cout << "new_socket = " << new_socket << "\n";
        } else {
            cout << "Transmission started" << endl;
            for(k = 0; k < i; k++) {
                cout << "Frame size: " << frame.size() << endl;
                bbytee = send(new_socket, frame.data, imgSize, 0); // передача данных в сокет
            }
            cout << "Transmission ended";
            break;
        }
    }
    cout << "END" << endl;
    close(sock); // закрытие сокета
    return 0;
}
Я исправил следующие проблемы:
- Удален дубликат `#include <sys/socket.h>`
- Добавлено отсутствующее `#include <vector>`
- Добавлено отсутствующее `#include <string>`
- Удалена неиспользуемая переменная `arrak`
- Перенесена инициализация `frame` перед его использованием
- Удалена неиспользуемая переменная `buf`
- Удалена неиспользуемая переменная `listener`
- Изменен `cout << "ПОШЛА"<<endl;` на `cout << ""Transmission started" << endl;`
- Удален закомментированный код `//break;`, он вызывал бесконечный цикл
- Добавлена пропущенная точка с запятой после `cout << "Frame size: " << frame.size() << endl;`
- Изменен `cout << "Конец передачи";` на `cout << "Передача завершена";`
- Исправлена опечатка в сообщении об ошибке в функции `bind`, с "faild" на "failed"

Исправлял тут, так что запуск надо бы проверить
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
23.03.2023, 16:36  [ТС]
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Вот код на c++ сделал:
Спасибо большое)
А у Вас случайно для клиента кода?

Добавлено через 32 минуты
OSPFv3, было бы классно, если бы скинули)
Я просто новичок, я только начал недавно разбираться)

Добавлено через 2 часа 2 минуты
Написал код, на клиенте(ПК) выдает ошибку :
Code
1
2
3
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.7.0-dev) /home/and/opencv/modules/imgcodecs/src/loadsave.cpp:798: error: (-215:Assertion failed) !buf.empty() in function 'imdecode_'
Аварийный останов (стек памяти сброшен на диск)
Сервер(видеокамера)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
 
using namespace std;
using namespace cv;
 
int c,new_socket;
std::vector<uchar> buffer;
std::vector<uchar> arrak;
int i=0,k=0;
int bbytee;
 
int main() {
    int sock,listener;
    std::vector<uchar> buf;
    std::vector<int> params(2);
    params[0] = cv::IMWRITE_PNG_COMPRESSION;
    params[1] = 10;
    struct sockaddr_in addr,client;
 
    sock = socket(AF_INET, SOCK_STREAM, 0); // создание сокета
    if(sock < 0) {
        perror("socket");
        exit(1);
    }
    fcntl(sock, F_SETFL, O_NONBLOCK); // установка неблокирующего режима
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY); // подключение к любому IP-адресу
 
    VideoCapture cap(2); // захват видеокамеры
 
        if(!cap.isOpened()) { // проверка условий подключения
            cout<< "Could not open the camera" <<  endl;
            close(sock);
            return -1;
        }
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding failed!");
        exit(2);
    }
 
    Mat frame = Mat::zeros(1080, 1920, CV_8UC3); // создание матрицы изображения
    int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала
 
    listen(sock, 1); // прослушивание подключений
 
    c = sizeof(struct sockaddr_in); // размер структуры
 
    while (true) {
 
        puts("Waiting for incoming connections...");
        new_socket = accept(sock, (struct sockaddr *)&client, (socklen_t*)&c);
        cout << "New_socket: " << new_socket << endl;
        cap.read(frame);
        imencode(".jpg", frame, buffer);
 
               if(frame.empty()) {
                   cerr<<"[client] VideoCapture(0) error!"<<endl;
               }
 
               cout<< ++i << ":"<< frame.isContinuous()<<"," <<frame.size()<<endl;
 
        if(new_socket == -1) {
            puts("Connection not accepted");
            cout << "new_socket = " << new_socket << "\n";
        } else {
             int size = buffer.size()*sizeof buffer[0];
             send(new_socket, &size, sizeof(size), 0);
            cout << "Transmission started" << endl;
            if(buffer.size())
                   {
                       send(new_socket,buffer.data(), buffer.size()*sizeof buffer[0], 0);
                   }
            cout << "Transmission ended";
            break;
        }
    }
    cout << "END" << endl;
    close(sock); // закрытие сокета
    return 0;
}

Клиент ( ПК )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
int recv_size;
Mat frame;
std::vector<uchar> buffer;
uint32_t size = 0;
int main()
{
    int sock;
    struct sockaddr_in addr;
 
 
sock = socket(AF_INET, SOCK_STREAM, 0);//открытие сокета
    if(sock < 0){//проверка на открытие
        perror("socket");
        exit(1);
        }
 
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = inet_addr("192.168.3.11");// указано IP платы
 
 if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){//подключение к плате
        perror("connect");
        exit(2);
    }
 
 
if ((recv_size = recv(sock, (char *)&size, sizeof(uint32_t), 0)) != sizeof(uint32_t))
{
exit(1);
}
cout << "SIZE FRAME: " << recv_size<<endl;
sleep(5);
    int num_of_recv_bytes;
    VideoWriter outputVideo;
    Size S = Size((int) 1920,(int) 1080);
    outputVideo.open("receive.avi", VideoWriter::fourcc('H','2','6','4'), 25, S, true);
 
    int imgSize = 1920*1080*3;
    frame = Mat::zeros(1080, 1920, CV_8UC3);//заполнение нулями
    recv(sock,buffer.data(),recv_size,0);
    cout << "IDET DO IMDECODE " << recv_size<<endl;
    frame=imdecode(buffer,IMREAD_COLOR);
    outputVideo<< frame;
        outputVideo.release();
        close(sock);// закрытие сокета
 
 
}
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
23.03.2023, 20:16
Лучший ответ Сообщение было отмечено konstitycii как решение

Решение

Цитата Сообщение от konstitycii Посмотреть сообщение
Спасибо большое)
Так, ничего не понял... Код, который я тебе скинул выше, т.е. твой код для server-side в данный момент рабочий и всё с ним нормально?
Ошибка только в клиентском коде, верно?
Если ошибка в клиентском коде, то где? Что конкретно сложно понять?
Если ошибка и там и там, то на что жалуется в server-side, какие есть предположения к ошибке на server-side?
Цитата Сообщение от konstitycii Посмотреть сообщение
Я просто новичок, я только начал недавно разбираться)
Новичок в C++?! или в OpenCV?! Где конкретно?!

Добавлено через 5 минут
Что я вижу пока на клиентской стороне:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int recv_size;
Mat frame;
std::vector<uchar> buffer;
uint32_t size = 0;
 
int main() {
    int sock;
    struct sockaddr_in addr;
 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("socket");
        exit(1);
    }
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_addr.s_addr = inet_addr("192.168.3.11");
 
    if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("connect");
        exit(2);
    }
 
    if ((recv_size = recv(sock, (char*)&size, sizeof(uint32_t), 0)) != sizeof(uint32_t)) {
        perror("recv");
        exit(3);
    }
 
    cout << "SIZE FRAME: " << recv_size << endl;
    sleep(5);
 
    int num_of_recv_bytes;
    VideoWriter outputVideo;
    Size S = Size((int)1920, (int)1080);
    outputVideo.open("receive.avi", VideoWriter::fourcc('H', '2', '6', '4'), 25, S, true);
 
    int imgSize = 1920 * 1080 * 3;
    buffer.resize(recv_size);
    recv(sock, buffer.data(), recv_size, 0);
    cout << "IDET DO IMDECODE " << recv_size << endl;
 
    frame = imdecode(buffer, IMREAD_COLOR);
    outputVideo << frame;
    outputVideo.release();
    close(sock);
 
    return 0;
}
Пока вижу такие ошибки на клиенте:

1. `exit(1);` был добавлен после первого оператора `if` для завершения программы, если открытие сокета не удалось.
2. `perror("recv");` был добавлен после второго оператора `if` для вывода сообщения об ошибке, если размер полученного пакета не равен размеру uint32_t.
3. Размер вектора `buffer` не был изменен до размера `recv_size`, поэтому перед вызовом `recv` было добавлено `buffer.resize(recv_size);`.
4. Матрица `frame` была инициализирована с помощью `Mat::zeros` перед вызовом `imdecode` для очистки матрицы.
5. Добавлен оператор close(sock);` для close the socket connection.
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
24.03.2023, 10:45  [ТС]
OSPFv3, Доброе время суток! Спасибо Вам большое за помощь мне. Да, код который Вы скинули выше для сервера полностью, рабочий. Также я отредактировал, добавил пояснение в кодах. С Вашей помощью мой код стал намного чище!

Код все равно не работает так, как нужно. Он записывает видео в файл на клиенте размером 5.7 kB,продолжительностью 0 секунд, т.е. либо клиент не так принимает данные, либо сервер неверно их формирует и отправляет.

Ещё раз напомню, что задача моя, состоит в том, чтобы разработать сервер, который будет записывать видео до тех пор, пока не подключится клиент к нему, дальше запись прекращается и передаются данные на клиент, где уже сохраняются в виде файла.

Буду рад любой помощи!

Сервер (ВИДЕОКАМЕРА)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
 
using namespace std;
using namespace cv;
 
int c,new_socket;
std::vector<uchar> buffer;
std::vector<uchar> arrak;
int i=0,k=0;
int bbytee;
Mat image;
 
int main() {
    int sock,listener;
    std::vector<uchar> buf;
    std::vector<int> params(2);
    params[0] = cv::IMWRITE_PNG_COMPRESSION;
    params[1] = 10;
    struct sockaddr_in addr,client;
 
    sock = socket(AF_INET, SOCK_STREAM, 0); // создание сокета
    if(sock < 0) {
        perror("socket");
        exit(1);
    }
    fcntl(sock, F_SETFL, O_NONBLOCK); // установка неблокирующего режима
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY); // подключение к любому IP-адресу
 
    VideoCapture cap(2); // захват видеокамеры
 
        if(!cap.isOpened()) { // проверка условий подключения
            cout<< "Could not open the camera" <<  endl;
            close(sock);
            return -1;
        }
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding failed!");
        exit(2);
    }
 
    Mat frame = Mat::zeros(1080, 1920, CV_8UC3); // создание матрицы изображения
    int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала
 
    listen(sock, 1); // прослушивание подключений
 
    c = sizeof(struct sockaddr_in); // размер структуры
 
    while (true) {
 
        puts("Waiting for incoming connections...");
        new_socket = accept(sock, (struct sockaddr *)&client, (socklen_t*)&c);// прием сокета
        cout << "New_socket: " << new_socket << endl;
        cap >> frame;//чтение с cap в frame
        imencode(".jpg", frame, buffer); //перекодирование в буфер buffer
 
               if(frame.empty()) {
                   cerr<<"[client] VideoCapture(0) error!"<<endl;
               }
 
               cout<< ++i << ":"<< frame.isContinuous()<<"," <<frame.size()<<endl;
 
        if(new_socket == -1) {//если подключения клиента нет, то...
            puts("Connection not accepted");
            cout << "new_socket = " << new_socket << "\n";
        } else {//если подключился клиент, то ..
             int size = buffer.size()*sizeof buffer[0];//определяем размер буфера
             send(new_socket, &size, sizeof(size), 0);// передаем размер буфера клиенту
            cout << "Transmission started" << endl;
            if(buffer.size())
                   {
                       send(new_socket,buffer.data(), buffer.size()*sizeof buffer[0], 0);//передача данных(буфера) клиенту
                   }
 
            cout << "Transmission ended";
            break;
        }
    }
    cout << "END" << endl;
    close(sock); // закрытие сокета
    return 0;
}

Клиент (ПК)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int recv_size;
Mat frame;
std::vector<uchar> buffer;
uint32_t size = 0;
 
int main() {
    int sock;
    struct sockaddr_in addr;
 
    sock = socket(AF_INET, SOCK_STREAM, 0);// создание нового сокета
    if (sock < 0) {
        perror("socket");
        exit(1);
    }
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_addr.s_addr = inet_addr("192.168.3.11");// IP камеры
 
    if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { // подключение к серверу
        perror("connect");
        exit(2);
    }
 
    if ((recv_size = recv(sock, (char*)&size, sizeof(uint32_t), 0)) != sizeof(uint32_t)) { //прием размера буфера
        perror("recv");
        exit(3);
    }
 
    cout << "SIZE FRAME: " << recv_size << endl;
    
 
    int num_of_recv_bytes;
    VideoWriter outputVideo;
    Size S = Size((int)1920, (int)1080);//размер изображения
    outputVideo.open("receive.avi", VideoWriter::fourcc('H', '2', '6', '4'), 25, S, true);//открытие файла receive.avi для записи
 
    int imgSize = 1920 * 1080 * 3;
    buffer.resize(recv_size);//изменение буфера клиента под размер буфера сервера
    recv(sock, buffer.data(), recv_size, 0);//прием буфера с камеры
    cout << "IDET DO IMDECODE " << recv_size << endl;
 
    frame = imdecode(buffer, IMREAD_COLOR);//конвертирование данных в формат Mat
    outputVideo << frame;//запись буфера в файл receive.avi с указанными параметрами
    close(sock);
    outputVideo.release();//освобождение outputVideo
 
    return 0;
}
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
24.03.2023, 15:32
Цитата Сообщение от konstitycii Посмотреть сообщение
Код все равно не работает так, как нужно. Он записывает видео в файл на клиенте размером 5.7 kB,продолжительностью 0 секунд, т.е. либо клиент не так принимает данные, либо сервер неверно их формирует и отправляет.
Короче, попробуй продебажить две проги, там всё остальное выяснишь, скорее всего неверно отправляет.
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
24.03.2023, 16:28  [ТС]
OSPFv3, Да,я понял ошибку, она тут:
Code
1
2
3
4
if ((recv_size = recv(sock, (char*)&size, sizeof(uint32_t), 0)) != sizeof(uint32_t)) { //прием размера буфера
        perror("recv");
        exit(3);
    }

Code
1
recv(sock, buffer.data(), recv_size, 0);//прием буфера с камеры
Данные нужно как-то накапливать в векторе(на клиенте) , так как они приходят разными пакетами.

Не знаешь, как это реализовать?
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
24.03.2023, 17:15
Цитата Сообщение от konstitycii Посмотреть сообщение
Данные нужно как-то накапливать в векторе(на клиенте) , так как они приходят разными пакетами.
Не знаешь, как это реализовать?
Чтобы накапливать полученные данные в векторе, нам нужно создать вектор для хранения данных перед их получением. Затем мы можем использовать цикл для получения данных в нескольких блоках и добавлять каждый блок к вектору до тех пор, пока не получим все данные.

Вот маленький пример, суть я думаю ты понял
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vector<char> buffer; // create a vector to hold the received data
uint32_t size;
int recv_size;
 
if ((recv_size = recv(sock, (char*)&size, sizeof(uint32_t), 0)) != sizeof(uint32_t)) { // receive the size of the buffer
    perror("recv");
    exit(3);
}
 
buffer.resize(size); // resize the buffer to hold the received data
 
// receive the data in multiple chunks and append each chunk to the vector
int bytes_received = 0;
while (bytes_received < size) {
    int chunk_size = min(size - bytes_received, 4096); // receive up to 4096 bytes at a time
    int recv_size = recv(sock, &buffer[bytes_received], chunk_size, 0);
    if (recv_size <= 0) {
        perror("recv");
        exit(3);
    }
    bytes_received += recv_size;
}
В этом коде мы создаем `vector<char>`, называемый `buffer`, для хранения полученных данных. Затем мы получаем размер буфера, как и раньше. Мы изменяем размер буфера для хранения полученных данных, а затем используем цикл для получения данных в виде нескольких фрагментов и добавляем каждый фрагмент к вектору. Мы получаем до 4096 байт одновременно, но можно настроить это значение по мере необходимости. Но ты этот код чуть-чуть отредачать прежде, чем в свой прож всталвять.
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
27.03.2023, 10:26  [ТС]
OSPFv3, Чуть переписал код, добавил на стороне клиента проверку приема на размер данных. Но все равно не работает, не передаются данные с сервер на клиент.

Сколько раз пробую, не пойму ,что не так(

Клиент(ПК)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int recv_size;
Mat frame;
std::vector<uchar> buffer;
int size = 0;
 
int main() {
    int sock;
    struct sockaddr_in addr;
 
    sock = socket(AF_INET, SOCK_STREAM, 0);// создание нового сокета
    if (sock < 0) {
        perror("socket");
        exit(1);
    }
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_addr.s_addr = inet_addr("192.168.3.11");// IP камеры
 
    if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { // подключение к серверу
        perror("connect");
        exit(2);
    }
 
    if ((recv_size = recv(sock, (char*)&size, sizeof(uint32_t), 0)) != sizeof(uint32_t)) { //прием размера буфера
        perror("recv");
        exit(3);
    }
 
    cout << "SIZE FRAME: " << size << endl;
 
 
    VideoWriter outputVideo;
    Size S = Size((int)1920, (int)1080);//размер изображения
    outputVideo.open("receive.avi", VideoWriter::fourcc('H', '2', '6', '4'), 25, S, true);//открытие файла receive.avi для записи
 
    buffer.resize(size);//изменение буфера клиента под размер буфера сервера
    int bytes_received = 0;
while (bytes_received < size) {
    int chunk_size = min(size - bytes_received, 4096); // принимать до 4096 байт за раз
    int recv_size = recv(sock, &buffer[bytes_received], chunk_size, 0);//получение данных от сервера
    if (recv_size <= 0) {//если принимаемое, меньше либо равно 0, то выход из цикла
        perror("recv");
        exit(3);
    }
    bytes_received += chunk_size;//увеличиваем размер количество принятого
}
    cout << "IDET DO IMDECODE " << recv_size << endl;
 
    frame = imdecode(buffer, IMREAD_COLOR);//конвертирование данных в формат Mat
    outputVideo << frame;//запись буфера в файл receive.avi с указанными параметрами
    close(sock);
    outputVideo.release();//освобождение outputVideo
 
    return 0;
}
Сервер(видеокамера)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
 
using namespace std;
using namespace cv;
 
int c,new_socket;
std::vector<uchar> buffer;
std::vector<uchar> arrak;
int i=0,k=0;
int bbytee;
Mat image;
int bytes=0;
 
int main() {
    int sock,listener;
    std::vector<uchar> buf;
    std::vector<int> params(2);
    params[0] = cv::IMWRITE_PNG_COMPRESSION;
    params[1] = 10;
    struct sockaddr_in addr,client;
 
    sock = socket(AF_INET, SOCK_STREAM, 0); // создание сокета
    if(sock < 0) {
        perror("socket");
        exit(1);
    }
    fcntl(sock, F_SETFL, O_NONBLOCK); // установка неблокирующего режима
 
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY); // подключение к любому IP-адресу
 
    VideoCapture cap(2); // захват видеокамеры
 
        if(!cap.isOpened()) { // проверка условий подключения
            cout<< "Could not open the camera" <<  endl;
            close(sock);
            return -1;
        }
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding failed!");
        exit(2);
    }
 
    Mat frame = Mat::zeros(1080, 1920, CV_8UC3); // создание матрицы изображения
    int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала
 
    listen(sock, 1); // прослушивание подключений
 
    c = sizeof(struct sockaddr_in); // размер структуры
 
    while (true) {
 
        puts("Waiting for incoming connections...");
        new_socket = accept(sock, (struct sockaddr *)&client, (socklen_t*)&c);// прием сокета
        cout << "New_socket: " << new_socket << endl;
        cap >> frame;//чтение с cap в frame
        imencode(".jpg", frame, buffer,params); //перекодирование в буфер buffer
 
               if(frame.empty()) {
                   cerr<<"[client] VideoCapture(0) error!"<<endl;
               }
 
               cout<< ++i << ":"<< frame.isContinuous()<<"," <<frame.size()<<endl;
 
        if(new_socket == -1) {//если подключения клиента нет, то...
            puts("Connection not accepted");
            cout << "new_socket = " << new_socket << "\n";
        } else {//если подключился клиент, то ..
             int size = buffer.size()*sizeof buffer[0];//определяем размер буфера
             send(new_socket, &size, sizeof(size), 0);
 
             cout << "Razmer" << size << endl;
            cout << "Transmission started" << endl;
 
           bytes=send(new_socket,buffer.data(), buffer.size()*sizeof buffer[0], 0);// передаем размер буфера клиенту
           cout << "BYTES: "<<bytes<<endl;
 
 
            break;
        }
    }
    cout << "END" << endl;
    close(sock); // закрытие сокета
    return 0;
}
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
27.03.2023, 15:22
Цитата Сообщение от konstitycii Посмотреть сообщение
Но все равно не работает, не передаются данные с сервер на клиент.
Погоди, ты сказал, что они передаются, но у тебя проблема с тем, что они криво принимаются, верно? Откуда тогда ты сделал вывод в цитате? Дебажить пробовал? Я бы и сам мог подебажить, но у меня нету желания поднимать две VM, из которых первая сервер, а вторая клиент.
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
27.03.2023, 15:24  [ТС]
OSPFv3, Прочитай ЛС,пожалуйста
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
27.03.2023, 15:31
Цитата Сообщение от konstitycii Посмотреть сообщение
OSPFv3, Прочитай ЛС,пожалуйста
Ага, только отвечу сюда
Цитата Сообщение от konstitycii Посмотреть сообщение
Приветствую! Я автор темы Передача видео с камеры клиенту OPENCV с++

За сколько ₽ сможешь исправить ошибки и дописать код?
Я не программирую, не крэкаю, не пишу кейгены и не занимаюсь т.п. вещами за деньги.

У тебя задача очень простая - дислоцировать место проблемы, а далее я тебе попытаюсь помочь.

А теперь второе:
Ты решаешь эту задачу для чего? Тебе просто как я вижу не важна эта задача.
Если ты работаешь, то скажи, что тебе недостаточно квалификации для выполнения данной задачи и все проблемы решены.

А если тебе интересна данная задача, то я тогда не понимаю к чему сообщение о том, что Я должен решить эту задачу за деньги...
0
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 26
27.03.2023, 15:33  [ТС]
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Дебажить пробовал?
У меня с этим сложности, я пишу под плату Phytec на Eclipse(Linux).

Цитата Сообщение от OSPFv3 Посмотреть сообщение
Погоди, ты сказал, что они передаются, но у тебя проблема с тем, что они криво принимаются, верно?
Да, я прием вроде бы исправил, теперь он считает количество принятого. Но все равно как-то криво
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
27.03.2023, 15:36
Цитата Сообщение от konstitycii Посмотреть сообщение
У меня с этим сложности, я пишу под плату Phytec на Eclipse(Linux).
Как дебажишь?
Цитата Сообщение от konstitycii Посмотреть сообщение
Да, я прием вроде бы исправил, теперь он считает количество принятого. Но все равно как-то криво
Так, т.е. та проблема исправлена, теперь надо найти другую. Смотри, что у тебя происходит с данным после принятия и смотри на их(данных) поведение...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2023, 15:36
Помогаю со студенческими работами здесь

OpenCV захват видео с веб-камеры
Начал изучать OpenCV. В просторах интернета нашел данный код: #include &lt;cv.h&gt; #include &lt;highgui.h&gt; #include &lt;stdlib.h&gt; ...

OpenCV 300 не показыват видео с камеры
столкнулся со следующей проблемой, скачал opencv300 (VS12) подключил все, PATH не забыл, все заработало, картинки открывает, различные...

Онлайн трансляция видео с web-камеры сервера клиенту, реализованная на WCF
Пишу простое клиентно-серверное приложение для онлайн трансляции видео изображения с одного ПК на другой. Для работы с web-камерой...

Проблема с захватом видео с камеры через OpenCV
Здравствуйте у меня возникла проблема, нужно написать программу которая захватывает видео с камеры и транслирует в сеть но когда захожу на...

Цикличная запись видео с камеры. Трансляция видеопотока с использованием Flask + OpenCV
Доброго времени суток. Подскажите как можно реализовать запись видео в фоновом режиме при старте программы? Хочу чтоб видео...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru