You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将IP摄像头实时流接入Python应用并通过OpenCV进行图像识别?

Alright, let's tackle how to get that camera stream from the shtml page into your Python + OpenCV workflow. Here's a practical, step-by-step guide covering the most common scenarios you'll run into:

Step 1: Extract the Actual Video Stream URL

The shtml page you linked is just a wrapper that embeds the video stream—you can't directly pass that URL to OpenCV. First, you need to find the underlying stream address:

  • Open the shtml page in your browser (Chrome/Firefox work best).
  • Open the Developer Tools (F12 or Ctrl+Shift+I), go to the Network tab.
  • Filter requests by Media (look for the dropdown or search bar labeled "Media").
  • Refresh the page. You'll see a request for a stream (common extensions: .mjpg, .m3u8, or a URL starting with rtsp://). That's your target stream URL.

Step 2: Process the Stream with OpenCV (By Stream Type)

Once you have the real stream URL, use one of these methods based on the stream protocol:

Case 1: RTSP Stream (Most Common for IP Cameras)

RTSP is a standard protocol for IP cameras, and OpenCV's VideoCapture supports it directly:

import cv2

# Replace with your extracted RTSP URL (may include username/password if required)
stream_url = "rtsp://username:password@61.60.112.230/your-stream-path"
cap = cv2.VideoCapture(stream_url)

if not cap.isOpened():
    print("Error: Failed to connect to stream")
    exit()

# Process frames in a loop
while True:
    ret, frame = cap.read()
    if not ret:
        print("Error: Could not read frame—stream may have ended")
        break
    
    # Add your image recognition logic here
    # Example: Convert to grayscale for object detection
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # Display the processed frame
    cv2.imshow("Camera Stream", gray_frame)
    
    # Press 'q' to exit the loop
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Cleanup
cap.release()
cv2.destroyAllWindows()

Case 2: HTTP MJPEG Stream

MJPEG streams are served over HTTP and work with OpenCV, though specifying the FFMPEG backend can fix compatibility issues:

import cv2

stream_url = "http://61.60.112.230/your-mjpeg-stream.mjpg"
# Use FFMPEG backend to ensure broad compatibility
cap = cv2.VideoCapture(stream_url, cv2.CAP_FFMPEG)

if not cap.isOpened():
    print("Error: Failed to open MJPEG stream")
    exit()

# Same frame processing loop as above
while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # Your image recognition code here
    cv2.imshow("MJPEG Stream", frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Case 3: HLS Stream (.m3u8)

OpenCV has limited native support for HLS, so use FFmpeg as an intermediary to convert the stream into a format OpenCV can read:

import cv2
import numpy as np
import subprocess as sp

stream_url = "http://61.60.112.230/your-stream.m3u8"

# FFmpeg command to convert HLS to raw BGR frames (matches OpenCV's format)
ffmpeg_cmd = [
    "ffmpeg",
    "-i", stream_url,
    "-f", "rawvideo",
    "-pix_fmt", "bgr24",
    "-vcodec", "rawvideo",
    "-"
]

# Start FFmpeg process
process = sp.Popen(ffmpeg_cmd, stdout=sp.PIPE, stderr=sp.PIPE, bufsize=10**8)

# Replace with your stream's actual resolution (find via Developer Tools or FFmpeg)
width, height = 640, 480
frame_size = width * height * 3

while True:
    # Read raw frame data from FFmpeg's stdout
    raw_frame = process.stdout.read(frame_size)
    if not raw_frame:
        break
    
    # Convert raw data to an OpenCV frame
    frame = np.frombuffer(raw_frame, dtype=np.uint8).reshape((height, width, 3))
    
    # Add your image recognition logic here
    cv2.imshow("HLS Stream", frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Cleanup
process.terminate()
cv2.destroyAllWindows()

Troubleshooting Common Issues

  • Authentication Required: If the stream needs login credentials:
    • For RTSP: Append username:password@ to the URL (e.g., rtsp://admin:12345@ip/stream).
    • For HTTP streams: Use FFmpeg's -headers flag to pass cookies or basic auth (e.g., -headers "Authorization: Basic YWRtaW46MTIzNDU=").
  • Anti-Hotlinking: Some streams check the referer header. Add -referer "http://61.60.112.230/view/viewer_index.shtml?id=938427" to your FFmpeg command to mimic the original page request.
  • Stream Lag: Reduce the frame processing workload (e.g., resize frames before recognition) or lower the stream resolution via the camera's admin panel.

内容的提问来源于stack exchange,提问作者Alabhya vaibhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:28:20