[英]OpenCV Error: Unsupported format or combination of formats (Unsupported combination of input and output formats) in getRectSubPix
[英]Unsupported format or combination of formats) ,FindContours
我想通过使用Haar级联来计算汽车的数量。
#import libraries of python opencv
import numpy as np
import cv2
import gc
import uuid
import datetime
import time
import csv
cap = cv2.VideoCapture('v3.mp4')
car_cascade = cv2.CascadeClassifier('cars.xml')
W = cap.get(3)
H = cap.get(4)
areaTH = 700
H1 = (H/2)+10
W1 = W/2
mx = 0
my = 30
while (cap.isOpened()):
#capture frame by frame
ret, frame = cap.read()
#convert video into gray scale of each frames
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#detect cars in the video
cars = car_cascade.detectMultiScale(gray, 1.1, 3)
#to draw arectangle in each cars
for (x,y,w,h) in cars:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
#display the resulting frame
cv2.imshow('video', frame)
#press Q on keyboard to exit
if cv2.waitKey(25) & 0xFF == ord('q'):
break
Line1 = np.array([[20,H1],[310,H1]], np.int32).reshape((-1,1,2))
frame = cv2.polylines(frame,[Line1],False,(0,0,255),thickness=5)
fram, contours0, hierarchy =
cv2.findContours(frame,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours0:
# cv2.drawContours(frame, cnt, -1, (0,255,0), 2, 8)
area = cv2.contourArea(cnt)
#print ('Area : '+str(area))
if area > areaTH:
#################
# TRACKING #
#################
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
x,y,w,h = cv2.boundingRect(cnt)
cv2.circle(frame,(cx,cy), 3, (255,0,0), -1)
img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
#print ('H1 : '+str(H1))
print('cy : '+str(cy))
if (cy >= 147) and (cy<= 155):
Vehicles = Vehicles + 1
Line1 = np.array([[200,H1],[880,H1]],
np.int32).reshape((-1,1,2))
frame = cv2.polylines(frame,[Line1],False,(255,0,0),thickness=5)
cv2.imshow('Frame',frame)
#Abort and exit with 'Q' or ESC
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release() #release video file
cv2.destroyAllWindows()
我将图像正确转换为灰度并成功在框架上绘制了一条线,问题是我遇到了此错误
错误:OpenCV(3.4.2)C:\\ build \\ 3_4_winpack-bindings-win32-vc14-static \\ opencv \\ modules \\ imgproc \\ src \\ contours.cpp:199:错误:(-210:不支持的格式或格式组合) [开始]当模式!= CV_RETR_FLOODFILL时,FindContours仅支持CV_8UC1图像,否则仅在函数'cvStartFindContours_Impl'中支持CV_32SC1图像
每当我在此代码行中传递变量“ frame”时,有人可以帮助我解决此错误吗?
fram, contours0, hierarchy =
cv2.findContours(frame,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
如果您查看OpenCV文档,则会看到函数cv2.findContour()
需要单色图像。 您传递仍在3个通道中的frame
。 您应该使用gray
变量,而不是( cv2.findContours(gray,...)
从cv2.findContour()
的文档中
图像 – 源,一个8位单通道图像。 非零像素被视为1。 零像素保持为0,因此图像被视为binary。 您可以使用compare(),inRange(),threshold(),adaptiveThreshold(),Canny()和其他图像来创建灰度或彩色的二进制图像。 该功能在提取轮廓时修改图像。 如果mode等于CV_RETR_CCOMP或CV_RETR_FLOODFILL,则输入也可以是标签(CV_32SC1)的32位整数图像。
试试这条线来缩放像素
image = cv2.convertScaleAbs(image)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.