Захватите живой поток от байта камеры, используя Open CV (C ++) - PullRequest
0 голосов
/ 27 февраля 2020

Я использую симулятор (это набор кодов), который считывает данные из источника и преобразует их в сигналы (например, оптический сигнал и т. Д. c.). Я пытаюсь реализовать следующее в VS2019:

  1. Захват видео с камеры побайтно (я не уверен, если это возможно)
  2. Преобразование видео байтов в сигнал и сохранение их в буфер (для этого используется функция «bufferPut»)
  3. Шифрование этого сигнала, содержащего байты видео
  4. Отправка зашифрованных данных на другой компьютер
  5. Расшифровка данные на втором компьютере и воспроизведение видео

Мне удалось захватывать с камеры кадр за кадром (но мне нужно побайтно), используя эту ссылку: Чтение и запись видео в Open CV

  1. Не могли бы вы помочь мне с тем, как захватывать байт за байтом, а не кадр за кадром?
  2. Если мне нужно использовать другую библиотеку для этой цели, пожалуйста, дайте мне знаю.

Здесь вы можете увидеть мою кодировку:

bool LoadFromCamera::runBlock(void) {

int space = outputSignals[0]->space();

if (!space) return false;


// # Create a VideoCapture object and use camera to capture the video ##############################
cv::VideoCapture cap(0);


// # Check if camera opened successfully ###########################################################
if (!cap.isOpened())
{
    std::cerr << "Error opening video stream" << std::endl;
    return -1;

    //system("pause");
    //system("exit");

}

// # Default resolution of the frame ###############################################################
int frame_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int frame_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);


// # Define the codec and create VideoWriter object.The output is stored in 'outcpp.avi' file. #####
cv::VideoWriter video("outcpp.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, cv::Size(frame_width, frame_height));
while (1)
{
    cv::Mat frame;

    cap >> frame; // Capture frame-by-frame

    if (frame.empty()) // If the frame is empty, break immediately
        break;



    outputSignals[0]->bufferPut((std::byte*)frame.data, frame.rows * frame.cols * frame.channels()); // Converts the frame into signal and save it into buffer



    video.write(frame); // Writes the frame into the file 'outcpp.avi'

    imshow("Frame", frame); // Displays the resulting frame 

    char c = (char)cv::waitKey(1); // Press  ESC on keyboard to  exit
    if (c == 27)


        break;
}


// # Release the video capture and write object #################################################
cap.release();
video.release();

// # Closes all the windows #####################################################################
cv::destroyAllWindows();

return 0;

}

Большое вам спасибо!

1 Ответ

0 голосов
/ 27 февраля 2020

байтов ... о каких байтах вы говорите? Есть байты, которые передаются между датчиком изображения и контроллером камеры / процессором изображения, байты, которые передаются по соединению камеры (USB, Ethe rnet, ...), байты, которые передаются между USB или сетью стек и драйвер устройства, байты, которые передаются между медиа-API и приложением, ...

Я не думаю, что вы заботитесь о байтах в каком-то особом смысле. Вы получаете изображение, вы хотите зашифровать его и отправить его дальше. Все изображения в байтах внизу. Там буквально ничего особенного делать. Используйте cv::Mat.ptr, чтобы получить указатель на каждую строку изображения, затем зашифровать его, и на принимающей стороне вам необходимо установить «пустое» назначение cv::Mat с тем же форматом и размером ( количество строк и столбцов), а затем расшифруйте каждую входящую строку матрицы и запишите ее в строку этой матрицы - полученную с использованием того же метода cv::Mat.ptr().

Если чего-то не хватает, вам придется отредактировать свой вопрос чтобы было понятно, что вы действительно хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...