OpenCV自适应阈值/轨迹栏操作

2024-07-05 15:55:48 发布

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

我对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

Tags: 轨迹defcv2kernelframeemptycapset
2条回答

blocksize的最小值必须为3,并且blocksize必须为奇数,因此:

    value_BSize= cv2.getTrackbarPos("bSize", "TrackBars")
    value_BSize = max(3,value_BSize)
    if (value_BSize % 2 == 0):
          
            value_BSize  += 1
         
tbar = (cv2.getTrackbarPos('trackbar', 'window')&~1)+3  # for smooth operation
tbar = cv2.getTrackbarPos('trackbar', 'window')*2+3  # for fast operation

相关问题 更多 >