OpenCV: как захватывать кадры с камеры Ethernet

Я ранее запрограммировал веб-камеру USB, единственная цель которой - получить живые кадры с камеры и отобразить в окне. Для этой цели я использовал cvCaptureFromCAM, который отлично работал с USB-камерой (см. Код ниже).

Я хочу знать, как захватывать кадры с камеры Gigabit Ethernet? Думаю, мне нужно захватывать кадры с некоторого IP-адреса по умолчанию, используя некоторый API. Может ли кто-нибудь указать мне правильное направление?

Я буду использовать C ++ с OpenCV в Windows 7 на процессоре Intel i3.

#include "cv.h"
#include "highgui.h"
#include <stdio.h>

// A Simple Camera Capture Framework 
int main() {
    CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
    if ( !capture ) {
        fprintf( stderr, "ERROR: capture is NULL \n" );
        getchar();
        return -1;
    }

    // Create a window in which the captured images will be presented
    cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );

    // Show the image captured from the camera in the window and repeat
    while ( 1 ) {
        // Get one frame
        IplImage* frame = cvQueryFrame( capture );

        if ( !frame ) {
            fprintf( stderr, "ERROR: frame is null...\n" );
            getchar();
            break;
        }

        cvShowImage( "mywindow", frame );

        // Do not release the frame!
        // If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
        // remove higher bits using AND operator
        if ( (cvWaitKey(10) & 255) == 27 ) break;
    }

    // Release the capture device housekeeping
    cvReleaseCapture( &capture );
    cvDestroyWindow( "mywindow" );
    return 0;
}

Обновить

Итак, теперь я могу отображать живые изображения в графическом интерфейсе программного обеспечения, предоставляемом поставщиком. Но все же я хочу отображать изображение (и, возможно, видео), используя IP-адрес камеры.

Когда я знаю IP-адрес камеры, почему я не могу получить доступ к данным (изображениям), отправленным камерой и отображаемым в браузере? Я попытался ввести IP-адрес камеры (например, 192.169.2.3) в моем браузере (192.169.2.4), но он сказал: «Страница не найдена». Что это значит?


person gpuguy    schedule 13.06.2012    source источник
comment
возможный дубликат OpenCV с сетевыми камерами   -  person karlphillip    schedule 13.06.2012
comment
Это также возможный дубликат OpenCV с камерами GigE Vision.   -  person karlphillip    schedule 13.06.2012


Ответы (3)


Вы можете сделать это с помощью genIcam API. genIcam - это общий интерфейс для камер (USB, GigE, CameraLink и т. д.). Он состоит из нескольких модулей, но мы сосредоточимся на GenTL (транспортном уровне). Дополнительную информацию о документации GenTL можно найти ЗДЕСЬ. Я рекомендую использовать либо Basler API, либо Baumer API, которые являются потребителями GenTL (производители и потребители описаны в документации GenTL). Я использовал API Баумера, но оба должны работать.

ПРИМЕЧАНИЕ. Я использую моно Baumer HXG20.

ЧТО СЛЕДУЕТ ЗАГРУЗИТЬ И УСТАНОВИТЬ

  1. Редакция сообщества Visual Studios (я использовал LINK 2015 г.)
  2. Baumer GAPI SDK, ССЫЛКА
  3. openCV (вот руководство youtube по созданию openCV 3 для c ++) ЗДЕСЬ

ПРОВЕРЬТЕ КАМЕРУ С ПОМОЩЬЮ CAMERA EXPLORER

Хорошо убедиться, что ваша сетевая карта (NIC) и камера работают, и поиграйте в программе Camera Explorer. Возможно, вам потребуется включить Jumbo-пакеты на вашей сетевой карте. Вы также можете настроить IP-адрес камеры с помощью программы IPconfig (DHCP или статический IP-адрес).

НАСТРОЙКА ВИЗУАЛЬНЫХ УЧАСТНИКОВ

Настройка переменных среды и настройка Visual Studios описана в руководстве программиста Baumer GAPI SDK (глава 4), расположенном в следующем каталоге.

C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide

  • Убедитесь, что у вас есть следующая системная переменная (при использовании 64-битной версии), или создайте переменную, если необходимо (см. Раздел 4.3.1 в руководстве программиста).

  • name = GENICAM_GENTL64_PATH

  • значение = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\

  • В Visual Studios создайте новый проект C ++ и обновите следующие свойства (см. Раздел 4.4.1 в руководстве программиста).

  • C / C ++ ›Общие› Дополнительные каталоги включения = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Inc

  • Компоновщик ›Общие› Дополнительные каталоги библиотек = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Lib\x64

  • Компоновщик ›Ввод› Дополнительные зависимости = bgapi2_genicam.lib

  • События сборки ›Событие после сборки› Command Line = copy "C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64"\*.* .\

СОЗДАЙТЕ ФАЙЛ .CPP ДЛЯ ОТОБРАЖЕНИЯ ПОТОКА ИЗОБРАЖЕНИЙ В ОКНЕ OPENCV

Самый простой способ начать - использовать один из примеров кода, предоставленный в Baumer GAPI SDK, и изменить его, чтобы добавить функциональность openCV. Пример кода для использования - 005_PixelTransformation, который находится здесь.

C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation

Скопируйте и вставьте этот файл .cpp в исходный каталог проекта и убедитесь, что его можно собрать и скомпилировать. Он должен захватить 8 изображений и распечатать первые 6 значений пикселей из первых 6 строк для каждого изображения.

Добавьте эти #include операторы в исходный файл .cpp:

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\video\video.hpp>

Добавьте эти объявления переменных в начало функции main()

// OPENCV VARIABLE DECLARATIONS
cv::VideoWriter cvVideoCreator;                 // Create OpenCV video creator
cv::Mat openCvImage;                            // create an OpenCV image
cv::String videoFileName = "openCvVideo.avi";   // Define video filename
cv::Size frameSize = cv::Size(2048, 1088);      // Define video frame size (frame width x height)
cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V', 'X'), 20, frameSize, true); // set the codec type and frame rate

В исходном файле 005_PixelTransformation.cpp в строке 569 есть цикл for, который перебирает 8 изображений, что означает for(int i = 0; i < 8; i++). Мы хотим изменить его, чтобы он работал непрерывно. Я сделал это, изменив его на цикл while, который говорит

while (pDataStream->GetIsGrabbing())

В нашем новом цикле while есть оператор if, который проверяет, является ли формат пикселей «монохромным» (оттенки серого) или цветным. В исходном файле он начинается со строки 619 и заканчивается на 692. Сразу после закрытия скобок операторов if и else и перед оператором pImage->Release(); нам нужно добавить часть openCV для отображения изображений в окне. Добавьте следующие строки кода

}   // This is the closing brace for the 'else color' statement 

// OPEN CV STUFF
openCvImage = cv::Mat(pTransformImage->GetHeight(), pTransformImage->GetWidth(), CV_8U, (int *)pTransformImage->GetBuffer());

// create OpenCV window ----
cv::namedWindow("OpenCV window: Cam", CV_WINDOW_NORMAL);

//display the current image in the window ----
cv::imshow("OpenCV window : Cam", openCvImage);
cv::waitKey(1);

Следует отметить формат пикселей в объекте openCvImage. Моя камера моно 8-битная, поэтому мне нужно указать CV_8U. Если ваша камера RGB или 10-битных пикселей, вам необходимо указать правильный формат (см. Документацию openCV ЗДЕСЬ).

вы можете обратиться к другим примерам настройки параметров камеры.

теперь после сборки и компиляции у вас должно быть открыто окно openCV, в котором отображаются изображения с камеры!

ПАЛЬЦЫ ВВЕРХ!!!!

БОЛЬШЕ ЗА БОЛЬШЕ ГОЛОСОВ !!!!!

person mark jay    schedule 28.12.2016
comment
Я могу подтвердить, что это работает в программе Win32 Baumer-GAPI 2.8.1 на Win7 64bit с камерой Baumer TXG06. Спасибо за вторжение. - person Patrick K; 06.11.2017

Вы не сможете получить доступ к изображениям на камере, если на ней не запущен веб-сервер (проверьте его документацию). попробуйте ввести это в командной строке:

telnet 192.169.2.3 80

Если время ожидания telnet истекло, ваша камера не работает на сервере с портом по умолчанию 80.

Также см. Этот вопрос: Захват кода C ++ изображение с IP / Ethernet-камер (AXIS Cam)

person Bull    schedule 15.04.2013

Чтобы добавить в ответ отметки Джея (который я могу подтвердить, работает на Win7x64 внутри программы Win32 с использованием Baumer-GAPI2 2.8.1 и компилятор VC10 и камеру Baumer TXG06). Если камера настроена на захват Mono8 и вы намереваетесь захватить изображение того же формата CV_8UC1, то в примере 005_PixelTransformation.cpp вы можете вообще избежать создания BGAPI2::Image* pTransformImage и BGAPI2::Image* pImage и просто построить cv::Mat, используя указатель буферной памяти, как в следующий отрывок из моего GigE_cam класса:

bool GigE_cam::operator>>(cv::Mat& out_mat)
{
    bool success(false);
    try
    {
        _p_buffer_filled = _p_data_stream->GetFilledBuffer(static_cast<bo_uint64>(_timeout_ms));
        if(_p_buffer_filled != 0)
        {
            if(_p_buffer_filled->GetIsIncomplete())
            {
                _p_buffer_filled->QueueBuffer();
            }
            else
            {
                if(_p_buffer_filled->GetPixelFormat() == "Mono8")
                {
                    _image_out_buffer = cv::Mat(static_cast<int>(_p_buffer_filled->GetHeight()), 
                                                static_cast<int>(_p_buffer_filled->GetWidth()), 
                                                CV_8UC1, 
                                                static_cast<uchar*>(_p_buffer_filled->GetMemPtr()));
                    if(_image_out_buffer.data)
                    {
                        _image_out_buffer.copyTo(out_mat);
                        success = true;
                    }
                }
                else if(_p_buffer_filled->GetPixelFormat() == "Mono10")
                {
                    // Todo transform to BGR8 etc. not implemented
                }
                _p_buffer_filled->QueueBuffer(); // Queue buffer after use
            }
        }   
    }
    catch(BGAPI2::Exceptions::IException& ex)
    {
        _last_BGAPI2_error_str = ex.GetType();
    }
    return success;
}

Этот код получает полные кадры с камеры (776 X 582 пикселей) со скоростью 66,5 кадра в секунду, хотя даже в таблице указано только 64,0 кадра в секунду. Мне любопытно посмотреть, будет ли их API работать так же в Debian.

Входящее изображение

person Patrick K    schedule 06.11.2017
comment
В чем преимущество отказа от создания BGAPI2 :: Image *? Означает ли это, что данные изображения копируются один раз, а не дважды? - person ezekiel; 06.05.2020