OpenCV掩码奇怪的像素计数模式

2024-10-03 23:20:38 发布

您现在位置:Python中文网/ 问答频道 /正文

FrameMask

目标:我下面的代码首先创建一个红线掩码。然后,从中间的绿点开始,代码在右边一次迭代一个空格,直到在遮罩上找到一个白色像素(固定高度)。该像素由右侧的绿点表示。然后对左侧重复此过程以查找第一个左侧白色像素。我还设置了一个计数器来跟踪程序在每次搜索中找到的偶数与奇数像素的数量

问题:虽然这段代码似乎正常工作,但我的问题是,当迭代查找右侧的白色像素时,这些像素中的大多数总是偶数。在我看来,对于偶数和奇数像素的百分比,分布应该是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)我也尝试过从屏幕左侧开始迭代到左行的左边缘。因为我是向右迭代的,所以这些像素值中的大多数都是偶数

如能深入了解问题,将不胜感激


Tags: trueifmask像素cv2hsvframeint