【问题标题】:Opencv Create TrackbarOpencv 创建轨迹栏
【发布时间】:2022-01-05 01:44:03
【问题描述】:

当我运行这段代码时:

def nothing(x):
pass
cv.createTrackbar(‘R’, ‘image’, 0,255,nothing)

我收到此错误: 使用“值”指针是不安全且不推荐使用的。使用 NULL 作为值指针。获取轨迹栏值设置回调。

我找不到该怎么做。

【问题讨论】:

  • pass 在 nothing(x) 函数中没有缩进。您是否尝试过将其缩进?也请告诉我们错误类型。
  • 我尝试了很多不同的方法,包括你让我尝试的方法..
  • 错误:OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-u4kjpz2z\opencv\modules\highgui\src\window_w32.cpp:2359 : 错误: (-27:Null pointer) NULL window: 'image' in function 'icvCreateTrackbar' [WARN:0] global C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-u4kjpz2z\opencv\ modules\highgui\src\window.cpp (704) cv::createTrackbar UI/Trackbar(R@image): 使用 'value' 指针是不安全的并且不推荐使用。使用 NULL 作为值指针。获取轨迹栏值设置回调。
  • 您是否尝试返回 None 而不是通过?
  • 是的,我试试这个:cv.createTrackbar('R', 'image', 0,255,None) 我得到这个错误:on_change must be callable

标签: python opencv trackbar


【解决方案1】:

您没有显示导致问题的最小工作代码,所以我只能猜测。

您必须先创建窗口"image",然后才能使用createTrackbar()

cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255, function)

最小的工作示例:

import cv2

# --- functions ---

def function(value):
    print(value)

    new_img = img.copy()
    new_img[:,:,2] = value

    cv2.imshow('image', new_img)

# --- main ---
    
img = cv2.imread('lenna.png')

cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255, function)

cv2.imshow('image', img)
cv2.waitKey(0)

cv2.destroyAllWindows()

编辑:

具有三个轨迹栏的更复杂的示例,它们使用相同的功能但具有不同的索引。

import cv2

# --- functions ---

def function(index, value):
    percent = (value/100)
    #print(index, value, percent)

    img[:,:,index] = original_img[:,:,index] * percent

    cv2.imshow('image', img)
   
# --- main ---
 
img = cv2.imread('lenna.png')

original_img = img.copy()

cv2.namedWindow('image')

cv2.createTrackbar('R (%)', 'image', 100, 100, lambda value:function(2, value))
cv2.createTrackbar('G (%)', 'image', 100, 100, lambda value:function(1, value))
cv2.createTrackbar('B (%)', 'image', 100, 100, lambda value:function(0, value))

cv2.imshow('image', img)
cv2.waitKey(0)

cv2.destroyAllWindows()

来自维基百科的图片Lenna


编辑:

您的问题是您为窗口使用了两个名称 - imgimage - 但您应该在 namedWindow()createTrackbar()getTrackbarPos()imshow() 中使用相同的名称

顺便说一句:如果您使用'0 : OFF \n1 : ON' 创建轨迹栏,那么您还必须使用它来获得价值s = cv.getTrackbarPos(switch, 'image')

编辑:

您的代码似乎与文档中的demo 相同,demo 在所有命令中都使用"image"demo 也使用 cv.getTrackbarPos(switch, ...)

import cv2 as cv
import numpy as np

def nothing(x): 
    pass

img = np.array ((512,512,3), np.uint8) 
cv.namedWindow("image") 

cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('B', 'image', 0, 255, nothing)

switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image', 1, 1, nothing)

while True:
    cv.imshow('image', img)
    
    key = cv.waitKey(1) & 0xFF
    
    if key == 27:
        break
    
    r = cv.getTrackbarPos('R', 'image')
    g = cv.getTrackbarPos('G', 'image')
    b = cv.getTrackbarPos('B', 'image')
    s = cv.getTrackbarPos(switch, 'image')
    
    if s == 0:
        img[:] = 0 
        # reset trackbars
        #cv.setTrackbarPos('R', 'image', 0)
        #cv.setTrackbarPos('G', 'image', 0)
        #cv.setTrackbarPos('B', 'image', 0)
    else:
        img[:] = [b,g,r]
        
cv.destroyAllWindows()

nothing 中的代码相同,因此仅当您更改任何轨迹栏中的值时才会执行。

import cv2 as cv
import numpy as np

# --- functions ---

def nothing(value): 
    r = cv.getTrackbarPos('R', 'image')
    g = cv.getTrackbarPos('G', 'image')
    b = cv.getTrackbarPos('B', 'image')
    s = cv.getTrackbarPos(switch, 'image')

    if s == 0:
        img[:] = 0
        # reset trackbars
        #cv.setTrackbarPos('R', 'image', 0)
        #cv.setTrackbarPos('G', 'image', 0)
        #cv.setTrackbarPos('B', 'image', 0)
    else:
        img[:] = [b,g,r]
        
# --- main ---

img = np.array ((512,512,3), np.uint8)

cv.namedWindow("image") 

cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('B', 'image', 0, 255, nothing)

switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image', 1, 1, nothing)

while True:
    cv.imshow('image', img)
    
    key = cv.waitKey(1) & 0xFF
    
    if key == 27:
        break
    
cv.destroyAllWindows()

【讨论】:

  • 尝试两种解决方案我仍然得到同样的错误,我添加了所有代码
  • 我看到了你的代码,你的所有问题是你为 windows 使用了错误的名称。首先您创建名称为img 的窗口,但稍后您将跟踪栏分配给名称为image 的窗口,然后您显示名称为img 的窗口。您必须在所有命令中使用相同的名称 - imgimagenamedWindowcreateTrackbargetTrackbarPosimshow
  • 顺便说一句:你必须在s = cv.getTrackbarPos('0 : OFF \n1 : ON', 'image')中使用'0 : OFF \n1 : ON'而不是S
  • 您的代码似乎与demodemo 在所有命令中使用image 中的代码相同。而demo 也使用cv.getTrackbarPos(switch, ...)
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多