目标:我下面的代码首先创建一个红线掩码。然后,从中间的绿点开始,代码在右边一次迭代一个空格,直到在遮罩上找到一个白色像素(固定高度)。该像素由右侧的绿点表示。然后对左侧重复此过程以查找第一个左侧白色像素。我还设置了一个计数器来跟踪程序在每次搜索中找到的偶数与奇数像素的数量
问题:虽然这段代码似乎正常工作,但我的问题是,当迭代查找右侧的白色像素时,这些像素中的大多数总是偶数。在我看来,对于偶数和奇数像素的百分比,分布应该是50-50。类似地,当迭代查找左侧白色像素时,这些像素中的大多数总是奇数
此程序的常见输出:右偶数:795,右奇数:67,左偶数:46,左奇数:808
import cv2
import numpy as np
import time
import cv2
time.sleep(.1)
def callback(x):
pass
ilowH = 75
ihighH = 100
ilowS = 120
ihighS = 255
ilowV = 0
ihighV = 255
rightEven = 0
rightOdd = 0
leftEven = 0
leftOdd = 0
width = 1280
height = 720
cap = cv2.VideoCapture(0)
cap.set(3, width)
cap.set(4, height)
def dot(point, image):
cv2.circle(image, point, 5, (0,255,0), -2)
while(True):
# grab the frame
ret, frame = cap.read()
#Create mask
frame = 255 - frame
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_hsv = np.array([ilowH, ilowS, ilowV])
higher_hsv = np.array([ihighH, ihighS, ihighV])
mask = cv2.inRange(hsv, lower_hsv, higher_hsv)
frame = 255 - frame
center = int(width/2)
dot((center,int(height/2)), frame)
currRightPoint = center
currLeftPoint = center
rightPointFound = False
leftPointFound = False
while(rightPointFound == False):
currRightPoint = currRightPoint + 1
if (mask[int(height / 2)][currRightPoint] == 255):
rightPointFound = True
dot((currRightPoint, int(height/2)), frame)
if (currRightPoint % 2 == 0):
rightEven = rightEven + 1
else:
rightOdd = rightOdd + 1
if (currRightPoint == width - 1):
rightPointFound = True
while(leftPointFound == False):
currLeftPoint = currLeftPoint - 1
if (mask[int(height / 2)][currLeftPoint] == 255):
leftPointFound = True
dot((currLeftPoint, int(height/2)), frame)
if (currLeftPoint % 2 == 0):
leftEven = leftEven + 1
else:
leftOdd = leftOdd + 1
if (currLeftPoint == 0):
leftPointFound = True
print('Center: ' + str(center) + ', Right: ' + str(currRightPoint) + ', Left: ' + str(currLeftPoint))
# show thresholded image
cv2.imshow('mask', mask)
cv2.imshow('frame', frame)
k = cv2.waitKey(1) & 0xFF # large wait time to remove freezing
if k == 113 or k == 27:
break
print('Right Even: ' + str(rightEven) + ', Right Odd: ' + str(rightOdd))
print('Left Even: ' + str(leftEven) + ', Left Odd: ' + str(leftOdd))
cv2.destroyAllWindows()
cap.release()
对于这个应用程序,左右边缘之间的精确像素计数非常重要,所以我需要精确的值。由于这些值不是50%偶数和50%奇数,我相信我没有找到最精确的点
解决方案尝试1)如果摄像头的分辨率低于720p,我尝试使用不同的网络摄像头,但结果完全相同
解决方案尝试2)我也尝试过从屏幕左侧开始迭代到左行的左边缘。因为我是向右迭代的,所以这些像素值中的大多数都是偶数
如能深入了解问题,将不胜感激
目前没有回答
相关问题 更多 >
编程相关推荐