2012-06-13 72 views
7

Tôi có webcam USB được lập trình trước đó, mục đích duy nhất là lấy khung hình trực tiếp từ máy ảnh và hiển thị trong cửa sổ. Tôi đã sử dụng cvCaptureFromCAM cho mục đích đó, làm việc tốt cho USB Camera (xem mã bên dưới).OpenCV: Cách chụp khung hình từ camera Ethernet

Tôi muốn biết cách chụp khung hình từ máy ảnh Gigabit Ethernet? Tôi đoán tôi cần phải chụp khung từ một số địa chỉ IP mặc định bằng cách sử dụng một số API. Có thể một số điểm tôi đi đúng hướng?

Tôi sẽ sử dụng C++ với OpenCV trên Windows 7 trên bộ xử lý 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; 
} 

Cập nhật

Vì vậy, bây giờ tôi có thể hiển thị những hình ảnh sống trong các nhà cung cấp cung cấp giao diện phần mềm. Nhưng tôi vẫn muốn hiển thị hình ảnh (và có thể là video) bằng địa chỉ IP của máy ảnh.

Khi tôi biết địa chỉ IP của máy ảnh, tại sao tôi không thể truy cập dữ liệu (hình ảnh) do máy ảnh gửi và hiển thị trên trình duyệt? Tôi đã thử gõ địa chỉ ip của máy ảnh (tức là 192.169.2.3) trên trình duyệt của tôi (192.169.2.4), nhưng nó nói "trang không tìm thấy". Nó có nghĩa là gì?

+0

thể trùng lặp của [OpenCV với Mạng Máy ảnh] (http://stackoverflow.com/questions/712998/opencv-with-network-cameras) – karlphillip

+0

Nó cũng là một trùng lặp có thể xảy ra [OpenCV với GigE Vision Máy ảnh] (http://stackoverflow.com/questions/3345467/opencv-with-gige-vision-cameras). – karlphillip

+0

Cảm ơn, tôi đã nhận thấy nhận xét của bạn sau khi đăng cập nhật. Tôi sẽ xem xét các liên kết. – gpuguy

Trả lời

3

Bạn sẽ không thể truy cập hình ảnh trên máy ảnh nếu máy không có máy chủ web đang chạy (hãy kiểm tra tài liệu của máy chủ web). hãy thử gõ lệnh tại dấu nhắc lệnh:

telnet 192.169.2.3 80 

Nếu lần telnet ra, máy ảnh của bạn không chạy một máy chủ trên cổng mặc định 80.

Cũng thấy câu hỏi này: C++ code Capturing image from IP/Ethernet Cameras (AXIS Cam)

+0

cảm ơn điều này làm cho rất nhiều ý nghĩa. cảm ơn – gpuguy

0

Vì nó là camera IP có nghĩa là có một máy chủ web chạy, bạn phải biết cổng của máy chủ đó, bạn nên tìm nó trong hướng dẫn, nếu bạn không thể tìm thấy nó, có một chương trình gọi là "iSpy" chương trình này sẽ quét LAN và sẽ tìm thấy tất cả thông tin cần thiết để kết nối với CAM của bạn chỉ cần google cho iSpy và bạn có thể tải xuống, nó hoàn toàn miễn phí .

6

Bạn có thể thực hiện việc này bằng cách sử dụng API genIcam. genIcam là một giao diện chung cho máy ảnh (USB, GigE, CameraLink, vv). Nó bao gồm nhiều mô-đun nhưng những gì bạn quan tâm nhất là GenTL (lớp vận chuyển). Bạn có thể đọc thêm về tài liệu GenTL HERE. Để làm cho quá trình dễ dàng hơn, tôi khuyên bạn nên sử dụng API Basler hoặc API Baumer, là những người tiêu dùng GenTL (nhà sản xuất và người tiêu dùng được mô tả trong tài liệu GenTL). Tôi đã sử dụng API Baumer, nhưng cả hai sẽ hoạt động.

LƯU Ý: Tôi đang sử dụng máy ảnh mono Baumer HXG20.

NHỮNG ĐIỀU download và cài đặt

  1. trực quan eddition Studios Cộng đồng (tôi đã sử dụng 2015 LINK)
  2. Baumer GAPI SDK, LINK
  3. OpenCV (đây là một hướng dẫn youtube để xây dựng OpenCV 3 cho C++) HERE

TEST CAMER A WITH CAMERA EXPLORER

Bạn nên kiểm tra xem card giao tiếp mạng (NIC) và máy ảnh GigE của bạn có đang hoạt động hay không bằng camera bằng cách sử dụng chương trình Camera Explorer. Bạn có thể cần phải kích hoạt gói Jumbo trên NIC của bạn. Bạn cũng có thể cấu hình IP camera bằng cách sử dụng chương trình IPconfig. Tôi sử dụng cài đặt DHCP nhưng bạn cũng có thể sử dụng IP tĩnh cho máy ảnh và NIC của mình.

SETUP STUDIOS VISUAL

Các bước để thiết lập biến môi trường hệ thống của bạn và cấu hình trực quan xưởng được mô tả trong hướng dẫn lập trình SDK Baumer GAPI (chương 4), được đặt trong thư mục sau

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

  • Kiểm tra xem bạn có các biến hệ thống sau (nếu sử dụng phiên bản 64 bit), hoặc tạo ra các biến nếu cần thiết (re fer đến phần 4.3.1 trong hướng dẫn của lập trình viên).

    • name = GENICAM_GENTL64_PATH
    • value = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\
  • trong Visual Studio, tạo một dự án mới ++ C và cập nhật các thuộc tính sau (xem phần 4.4.1 trong hướng dẫn của lập trình viên).

    • C/C++> General> bổ sung bao gồm Thư mục = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Inc
    • Linker> General> Thư mục Thư viện bổ sung = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Lib\x64
    • Linker> Input> Dependencies bổ sung = bgapi2_genicam.lib
    • Build Sự kiện> Post-xây dựng tổ chức sự kiện > Dòng lệnh = copy "C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64"\*.* .\

tạo một file cpp để hiển thị IMAGE STREAM TRONG MỘT OpenCV WINDOW

Cách đơn giản nhất để bắt đầu là sử dụng một trong các mã ví dụ được cung cấp trong Baumer GAPI SDK và sửa đổi nó để thêm các chức năng OpenCV.Đoạn mã ví dụ để sử dụng là 005_PixelTransformation, mà nằm ở đây

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

Sao chép và dán tập tin cpp này vào thư mục nguồn dự án của bạn và chắc chắn rằng bạn có thể xây dựng và biên dịch. Nó sẽ chụp 8 ảnh và in ra 6 giá trị pixel đầu tiên từ 6 dòng đầu tiên cho mỗi ảnh.

Thêm những #include báo cáo đến tập tin nguồn cpp:

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

Thêm các khai báo biến vào đầu của main() chức năng

// 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 

Trong tập tin 005_PixelTransformation.cpp gốc, dòng 569 có vòng lặp for lặp lại trên 8 hình ảnh, có nội dung là for(int i = 0; i < 8; i++). Chúng tôi muốn thay đổi điều này để chạy liên tục. Tôi đã làm điều này bằng cách thay đổi nó vào một vòng lặp while nói rằng

while (pDataStream->GetIsGrabbing()) 

Trong while vòng mới của chúng tôi, có một tuyên bố if để kiểm tra nếu định dạng Pixel là 'Mono' (greyscale) hoặc màu sắc. Trong tệp gốc, nó bắt đầu tại dòng 619 và kết thúc tại 692. Ngay sau khi các dấu ngoặc đơn ifelse được đóng và trước câu lệnh pImage->Release();, chúng tôi cần thêm phần openCV để hiển thị hình ảnh vào cửa sổ. Thêm các dòng mã sau đây

} // 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); 

Một điều cần lưu ý là định dạng pixel trong đối tượng openCvImage. Máy ảnh của tôi là một bit 8 bit, vì vậy tôi cần phải chỉ định CV_8U. Nếu máy ảnh của bạn có pixel RGB hoặc 10 bit, bạn cần cung cấp định dạng đúng (xem tài liệu openCV HERE).

bạn có thể tham khảo các ví dụ khác để điều chỉnh thông số máy ảnh.

giờ đây khi bạn xây dựng và biên dịch, bạn nên mở một cửa sổ openCV hiển thị hình ảnh camera!

THUMPS LÊN ĐỂ NHIỀU THÊM LỜI NHIỀU NGƯỜI !!!! (Điều này mất rất nhiều thời gian để có được làm việc nên treo tôi lên !!!)

THUMBS UP FOR MORE UP VOTES!!!!!

+0

Tôi có thể xác nhận điều này hoạt động trong một chương trình Win32 Baumer-GAPI 2.8.1 trên Win7 64bit hát máy ảnh Baumer TXG06. Cảm ơn bạn đã tham gia. –

0

Để thêm vào mark jay 's câu trả lời (mà tôi có thể khẳng định công trình trên Win7x64 bên trong một chương trình Win32 sử dụng Baumer- GAPI2 2.8.1 và trình biên dịch VC10 và camera Baumer TXG06). Nếu máy ảnh được thiết lập để lấy Mono8 và bạn dự định chụp ảnh có cùng định dạng CV_8UC1, thì trong ví dụ 005_PixelTransformation.cpp bạn có thể tránh việc tạo BGAPI2::Image* pTransformImageBGAPI2::Image* pImage hoàn toàn và chỉ cần tạo cv::Mat bằng cách sử dụng con trỏ bộ nhớ đệm như trong đoạn trích sau đây từ lớp GigE_cam tôi:

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; 
} 

mã này là nhận được khung đầy đủ từ máy ảnh (776 X 582 px) tại 66,5 fps nơi thậm chí datasheet chỉ tuyên bố 64,0 fps. Tôi tò mò muốn biết liệu API của họ có hoạt động giống nhau trên Debian hay không.

Incoming Image

Các vấn đề liên quan