【问题标题】:OpenCV - Adaptive thresholding / Trackbar manipulationOpenCV - 自适应阈值/轨迹栏操作
【发布时间】:2021-01-28 23:35:32
【问题描述】:

我还是 OpenCV(Python) 的新手,我正在尝试 cv2.adaptiveThreshold() 在光线变化时通过运行网络摄像头来绘制正确的轮廓。主要问题是我在绘制轮廓时收到大量噪音,因此我尝试设置cv2.countourArea() 阈值,但这似乎不是最好的解决方案。

后来我决定尝试用一个简单的轨迹栏来操作cv2.adaptiveThreshold 的值。

特别是blockSizeCValue。在 CValue 上一切正常,但我在 blockSize 上确实很挣扎,因为它需要是一个奇数。我尝试了检查empty 回调函数的值是否为偶数并添加+1 的方法。但这似乎无法正常工作。稍后我很可能会使用机器学习来更改这些值,但现在我希望轨迹栏能够用于调试目的。

使用轨迹栏操作blockSize 的最佳解决方案是什么?

提前感谢您! :)

import cv2
import numpy as np

#####################################
winWidth = 640
winHeight = 840
brightness = 100

cap = cv2.VideoCapture(0)
cap.set(3, winWidth)
cap.set(4, winHeight)
cap.set(10, brightness)

kernel = (5, 5)
bSize_default = 1


#######################################################################
def empty(a):
    pass


cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 240)
cv2.createTrackbar("cVal", "TrackBars", 2, 20, empty)


def preprocessing(frame, cVal):
    imgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # mask = cv2.inRange(imgHsv, lower, upper)
    imgBlurred = cv2.GaussianBlur(imgGray, kernel, 3)
    gaussC = cv2.adaptiveThreshold(imgBlurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, cVal)
    imgDial = cv2.dilate(gaussC, kernel, iterations=3)
    imgErode = cv2.erode(imgDial, kernel, iterations=1)

    return imgDial


def getContours(imPrePro):
    contours, hierarchy = cv2.findContours(imPrePro, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 60:
            cv2.drawContours(imgCon, cnt, -1, (255, 0, 0), 3)


#######################################################################################################

while (cap.isOpened()):
    success, frame = cap.read()
    cVal = cv2.getTrackbarPos("cVal", "TrackBars")

    if success == True:
        frame = cv2.flip(frame, 1)
        imgCon = frame.copy()
        imPrePro = preprocessing(frame, cVal)
        getContours(imPrePro)
        cv2.imshow("Preprocessed", imPrePro)
        cv2.imshow("Original", imgCon)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            cv2.destroyAllWindows()
            break

【问题讨论】:

  • 如果值需要是奇数,那么对于一些k,值是2k + 1,那么使用k作为轨迹条值而不是实际值本身怎么样?换句话说,总是取trackbar的值,然后乘以2再加1。那么它总是奇数。例如,如果您想要 10 到 20 之间的奇数,则这些值为 2k + 1,其中 k 至少为 5 且小于 10。
  • 我试过了,但这确实会导致整个程序崩溃。

标签: python opencv computer-vision bit-manipulation image-thresholding


【解决方案1】:

blocksize 的最小值必须是 3,因此 blocksize 必须是奇数:

    value_BSize= cv2.getTrackbarPos("bSize", "TrackBars")
    value_BSize = max(3,value_BSize)
    if (value_BSize % 2 == 0):
          
            value_BSize  += 1
         

【讨论】:

  • 哇哦,我不知道最小值必须是 3!我只觉得这一定很奇怪。谢谢!现在我所有的其他方法都可以正常工作了,哈哈
【解决方案2】:
tbar = (cv2.getTrackbarPos('trackbar', 'window')&~1)+3  # for smooth operation
tbar = cv2.getTrackbarPos('trackbar', 'window')*2+3  # for fast operation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多