2014-01-24 161 views
7

下面給出的代碼用於訪問使用OpenCV的Axis IP攝像機。在運行程序時,它首先顯示「打開cap_ffmpeg_impl時出錯...」,然後顯示未找到相機。使用OpenCV訪問IP攝像機

#include <opencv\cv.h> 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv2\imgproc\imgproc.hpp> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 
using namespace cv; 

int main() 
{ 
    Mat frame; 
    namedWindow("video", 1); 
    VideoCapture cap("http://IPADDRESS/video.mjpg"); 
    if(!cap.isOpened()) 
    { 
     cout<<"Camera not found"<<endl; 
     getchar(); 
     return -1; 
    } 
    while (cap.isOpened()) 
    { 
     cap >> frame; 
     if(frame.empty()) break; 

     imshow("video", frame); 
     if(waitKey(30) >= 0) break; 
    } 
    return 0; 
} 

我在哪裏出錯了?

+0

確保所有的編解碼器以某種方式在系統上安裝。還是你成功地從本地機器打開它(通過放置本地路徑而不是url來測試它)?您可以嘗試手動下載並安裝ffmpeg(http://ffmpeg.zeranoe.com/builds/) –

+0

哦,好的。 FFMPEG必須在使用之前安裝? –

+0

您需要更改您提供給'VideoCapture cap(「http://IPADDRESS/video.mjpg」)的URL;' –

回答

6

當我試圖使用公共IP攝像頭顯示IP攝像頭時,我遇到了類似的問題。 Opencv需要一些典型的URL來打開攝像頭。請從下面的代碼中檢索URL。 下面是爲我工作的代碼。

int main(int, char**) { 
    cv::VideoCapture vcap; 
    cv::Mat image; 

    // This works on a D-Link CDS-932L 
    const std::string videoStreamAddress = "http://ID:[email protected]:PORTNO/mjpeg.cgi?user=ID&password=ID:PASSWORD&channel=0&.mjpg"; 
     //open the video stream and make sure it's opened 
    if(!vcap.open(videoStreamAddress)) { 
     std::cout << "Error opening video stream or file" << std::endl; 
     return -1; 
    } 

    for(;;) { 
     if(!vcap.read(image)) { 
      std::cout << "No frame" << std::endl; 
      cv::waitKey(); 
     } 
     cv::imshow("Output Window", image); 

     if(cv::waitKey(1) >= 0) break; 
    } 

} 

將此代碼照原樣複製並嘗試。

#include <stdio.h> 
#include <opencv2/opencv.hpp> 
#include <iostream> 
int main(int, char**) { 
    cv::VideoCapture vcap; 
    cv::Mat image; 

    // This works on a D-Link CDS-932L 

    const std::string videoStreamAddress = "http://USER:[email protected]:8088/mjpeg.cgi?user=USERNAME&password=PWD&channel=0&.mjpg"; 
     //open the video stream and make sure it's opened 
    if(!vcap.open(videoStreamAddress)) { 
     std::cout << "Error opening video stream or file" << std::endl; 
     return -1; 
    } 

    for(;;) { 
     if(!vcap.read(image)) { 
      std::cout << "No frame" << std::endl; 
      cv::waitKey(); 
     } 
     cv::imshow("Output Window", image); 

     if(cv::waitKey(1) >= 0) break; 
    } 

} 
+0

如何查找IP攝像機的端口號? –

+0

您可以從網絡攝像機的Web界面獲取端口號。 – Mayur

+0

此外,軸1103的流媒體鏈接是: http://IPADDRESS/axis-cgi/mjpg/video.cgi 那麼,我應該提供什麼鏈接?與用戶名和密碼的鏈接? –

2

以下作品的軸M1004-W通過以太網線連接到我的電腦:

  1. 在你的選擇(我使用Chrome)的瀏覽器,瀏覽到照相機的IP地址。根據需要提供憑據。
  2. 你應該從你的相機看直播的流。右鍵點擊視頻流,然後選擇「檢查元素」(或非Chrome瀏覽器中的等效項)。
  3. 您應該看到一個名爲src的變量 - 這是您可以在OpenCV中直接訪問攝像機的內容。我的號碼是/mjpg/video.mjpg,我敢打賭,你的是相似的。

你給OpenCV的地址應該是這樣的:

http://<USERNAME>:<PASSWORD>@<IP_ADDRESS>/<the value of src> 

這是我的樣子:

http://uname:[email protected]192.168.0.0/mjpg/video.mjpg 

我進入了我的地址到你的代碼,並可以看到視頻來自OpenCV窗口的流。

+1

這也適用於Axis M113網絡攝像機 – iAmNotVeryGoodAtThis

0

我在我的iphone上安裝了「Mini WebCam」應用程序,並將其用作IP地址爲「http://192.168.1.103」的ip地址。另外我用這段代碼:

VideoCapture capture; 
Mat image; 
if (!capture.open("http://192.168.1.103/video.cgi?.mjpg")) { 
    cout << "Error opening video stream or file" << endl; 
    return -1; 
} 
.... 

它的工作原理(http://192.168.1.103/video.cgi?.mjpg