2012-06-13 16 views
7

मैंने पहले प्रोग्राम किया यूएसबी वेबकैम है, जहां एकमात्र उद्देश्य कैमरा से लाइव फ्रेम प्राप्त करना और खिड़की में प्रदर्शित करना है। मैंने उस उद्देश्य के लिए cvCaptureFromCAM का उपयोग किया, जिसने यूएसबी कैमरा के लिए ठीक काम किया (नीचे कोड देखें)।ओपनसीवी: ईथरनेट कैमरे से फ्रेम कैप्चर कैसे करें

मैं जानना चाहता हूं कि मैं गिगाबिट ईथरनेट कैमरे से फ्रेम कैसे कैप्चर करूं? मुझे लगता है कि मुझे कुछ एपीआई का उपयोग करके कुछ डिफ़ॉल्ट आईपी पते से फ़्रेम कैप्चर करने की आवश्यकता है। क्या कोई मुझे सही दिशा में इंगित कर सकता है?

मैं इंटेल i3 प्रोसेसर पर विंडोज 7 पर ओपनसीवी के साथ सी ++ का उपयोग करूँगा।

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

अद्यतन

तो अब मैं विक्रेता प्रदान की सॉफ्टवेयर जीयूआई में रहते छवियों को प्रदर्शित करने में सक्षम हूँ। लेकिन फिर भी मैं कैमरे के आईपी पते का उपयोग कर छवि (और संभवतः वीडियो) प्रदर्शित करना चाहता हूं।

जब मुझे कैमरे का आईपी पता पता है, तो मैं कैमरे द्वारा भेजे गए डेटा (छवियों) तक पहुंच नहीं सकता और ब्राउज़र पर प्रदर्शित क्यों नहीं कर सकता? मैंने अपने ब्राउज़र (1 9 2.169.2.4) पर कैमरे के आईपी पते (यानी 1 9 2.169.2.3) टाइप करने का प्रयास किया, लेकिन यह कहता है कि "पृष्ठ नहीं मिला"। इसका क्या मतलब है?

+0

की [नेटवर्क कैमरा के साथ OpenCV] (http://stackoverflow.com/questions/712998/opencv-with-network-cameras) – karlphillip

+0

यह भी GigE विजन के साथ की [OpenCV एक संभव डुप्लिकेट है, संभव डुप्लिकेट कैमरा] (http://stackoverflow.com/questions/3345467/opencv-with-gige-vision-cameras)। – karlphillip

+0

धन्यवाद, मैंने अपडेट पोस्ट करने के बाद आपकी टिप्पणियां देखीं। मैं लिंक देख लूंगा। – gpuguy

उत्तर

3

यदि आप कोई वेब सर्वर नहीं चल रहे हैं (इसके डॉको की जांच करें) तो आप कैमरे पर छवियों तक पहुंच नहीं पाएंगे।

telnet 192.169.2.3 80 

टेलनेट का समय समाप्त, अपने कैमरे डिफ़ॉल्ट पोर्ट पर एक सर्वर चल नहीं है, तो 80

इसके अलावा इस प्रश्न देखें:: C++ code Capturing image from IP/Ethernet Cameras (AXIS Cam)

+0

धन्यवाद यह बहुत समझ में आता है। धन्यवाद – gpuguy

0

यह बाद से एक कमांड प्रॉम्प्ट पर इस लिखने का प्रयास आईपी ​​कैमरा है जिसका मतलब है कि एक वेब सर्वर चल रहा है, आपको उस सर्वर के बंदरगाह को जानना है, आपको इसे मैन्युअल में ढूंढना चाहिए, अगर आपको यह नहीं मिल रहा है, तो "iSpy" नामक एक प्रोग्राम है, यह प्रोग्राम स्कैन करेगा लैन और आईएएसपी के लिए सिर्फ अपने सीएएम से कनेक्ट करने के लिए आवश्यक सभी जानकारी मिल जाएगी और आप इसे डाउनलोड कर सकते हैं, यह मुफ़्त है ।

6

आप genIcam API का उपयोग कर ऐसा कर सकते हैं। जेनआईकैम कैमरे के लिए एक सामान्य इंटरफ़ेस है (यूएसबी, गीग, कैमरालिंक, आदि)। इसमें कई मॉड्यूल होते हैं लेकिन जेएनटीएल (परिवहन परत) के साथ आप सबसे ज्यादा चिंतित हैं। आप जेएनटीएल दस्तावेज HERE पर और अधिक पढ़ सकते हैं। प्रक्रिया को आसान बनाने के लिए, मैं बेसलर एपीआई या बाउमर एपीआई का उपयोग करने की सलाह देता हूं, जो जेनटीएल उपभोक्ता हैं (निर्माता और उपभोक्ता जेएनटीएल दस्तावेज में वर्णित हैं)। मैंने बाउमर एपीआई का इस्तेमाल किया, लेकिन दोनों काम करेंगे।

नोट: मैं बाउमर एचएक्सजी 20 मोनो कैमरा का उपयोग कर रहा हूं।

डाउनलोड और

  1. दृश्य स्टूडियो समुदाय Eddition (मैं इस्तेमाल किया 2015 LINK)
  2. Baumer GAPI एसडीके इन्सटाल चीजों, LINK
  3. openCV (यहाँ एक यूट्यूब ट्यूटोरियल के लिए openCV 3 का निर्माण करना है सी ++) HERE

परीक्षण कैमर कैमरे एक्सप्लोरर

यह जांचना एक अच्छा विचार है कि आपका नेटवर्क इंटरफ़ेस कार्ड (एनआईसी) और गीग कैमरा कैमरा एक्सप्लोरर प्रोग्राम का उपयोग करके कैमरे के साथ काम कर रहा है और खेल रहा है। आपको अपने एनआईसी पर जंबो पैकेट सक्षम करने की आवश्यकता हो सकती है। आप IPconfig प्रोग्राम का उपयोग कर कैमरा आईपी को भी कॉन्फ़िगर कर सकते हैं। मैं डीएचसीपी सेटिंग का उपयोग करता हूं लेकिन आप अपने कैमरे और एनआईसी के लिए एक स्थिर आईपी भी इस्तेमाल कर सकते हैं।

सेटअप दृश्य स्टूडियो

आपके सिस्टम वातावरण चर की स्थापना और दृश्य स्टूडियो विन्यस्त करने के लिए चरणों का

Baumer GAPI एसडीके प्रोग्रामर गाइड में वर्णित किया गया है (4 अध्याय) है, जो निम्न निर्देशिका में स्थित है

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

  • चेक आप निम्नलिखित प्रणाली चर राशि (यदि 64 बिट संस्करण का प्रयोग करके) या वैरिएबल अगर जरूरत (फिर से बनाने कि प्रोग्रामर की गाइड में सेक्शन 4.3.1 से फेर)।

    • नाम = GENICAM_GENTL64_PATH
    • मूल्य = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\
  • दृश्य स्टूडियो में, एक नया सी ++ प्रोजेक्ट बना देंगे और अद्यतन निम्नलिखित गुण (प्रोग्रामर की मार्गदर्शिका में खंड 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
    • बिल्ड घटनाक्रम> घटना के बाद बिल्ड > कमांड लाइन = copy "C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64"\*.* .\

बनाएँ OpenCV खिड़की

में छवि स्ट्रीम प्रदर्शित करने के लिए सबसे आसान तरीका है आरंभ करने के लिए एक .cpp फ़ाइल Baumer GAPI एसडीके में प्रदान की जाती उदाहरण कोड में से एक का उपयोग करें और openCV कार्यक्षमता जोड़ने के लिए इसे संशोधित करने के लिए है।उपयोग करने के लिए उदाहरण कोड 005_PixelTransformation है, जो यहाँ

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

कॉपी स्थित है और अपनी परियोजना के स्रोत निर्देशिका में इस .cpp फ़ाइल पेस्ट और सुनिश्चित करें कि आप का निर्माण और संकलन कर सकते हैं कर रहा है। इसे 8 छवियों को कैप्चर करना चाहिए और प्रत्येक छवि के लिए पहली 6 पंक्तियों से पहले 6 पिक्सेल मानों को प्रिंट करना चाहिए।

सीपीपी स्रोत फ़ाइल के लिए इन #include बयान जोड़ें:

#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(); कथन से पहले, हमें छवियों को विंडो में प्रदर्शित करने के लिए ओपनसीवी भाग जोड़ना होगा। नोट करने के लिए कोड की निम्न पंक्तियां जोड़ें

} // 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 निर्दिष्ट करना होगा। यदि आपका कैमरा आरजीबी या 10-बिट पिक्सेल है, तो आपको सही प्रारूप प्रदान करना होगा (ओपनसीवी दस्तावेज HERE देखें)।

आप कैमरा पैरामीटर समायोजित करने के लिए अन्य उदाहरणों का उल्लेख कर सकते हैं।

अब एक बार जब आप निर्माण और संकलन करते हैं, तो आपके पास एक ओपनसीवी विंडो खुली होनी चाहिए जो कैमरा छवियों को प्रदर्शित करे!

अधिक यूपी वोट लोगों के लिए थप्पड़ !!!! (यह बहुत काम कर मुझे हुक पाने के लिए बहुत समय ले लिया !!!)

THUMBS UP FOR MORE UP VOTES!!!!!

+0

मैं Win32 प्रोग्राम Baumer-GAPI 2.8.1 में Win7 64bit पर Baumer TXG06 कैमरा गाते हुए इस काम की पुष्टि कर सकता हूं। अंदरूनी के लिए धन्यवाद। –

0

mark jay के जवाब (जो मैं Baumer- का उपयोग कर एक Win32 प्रोग्राम के अंदर Win7x64 पर काम करता है की पुष्टि कर सकते में जोड़ने के लिए जीएपीआई 2 2.8.1 और वीसी 10 कंपाइलर और बाउमर 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; 
} 

इस कोड को 66.5 एफपीएस जहां भी डेटापत्रक केवल दावा है 64.0 एफपीएस पर कैमरा (776 एक्स 582 पिक्सल) की पूर्ण फ्रेम हो रही है। मैं यह देखने के लिए उत्सुक हूं कि क्या उनकी एपीआई डेबियन पर भी कार्य करेगी।

Incoming Image

संबंधित मुद्दे