我有一个咖啡罐的图像,橙色的盖子位置,我想找到.就这个
.
gcolor2实用程序显示盖子中心的HSV为(22,59,100).问题是如何选择颜色的限制呢?我尝试了min =(18,40,90)和max =(27,255,255),但是出乎意料
这是Python代码:
import cv
in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'
ORANGE_MIN = cv.Scalar(18, 40, 90)
ORANGE_MAX = cv.Scalar(27, 255, 255)
COLOR_MIN = ORANGE_MIN
COLOR_MAX = ORANGE_MAX
def test1():
frame = cv.LoadImage(in_image)
frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3)
cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV)
frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1)
cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed)
cv.SaveImage(out_image_thr, frame_threshed)
if __name__ == '__main__':
test1()
Run Code Online (Sandbox Code Playgroud) 我有以下图片:
我想使用cv::inRange方法和HSV颜色空间检测红色矩形.
int H_MIN = 0;
int H_MAX = 10;
int S_MIN = 70;
int S_MAX = 255;
int V_MIN = 50;
int V_MAX = 255;
cv::cvtColor( input, imageHSV, cv::COLOR_BGR2HSV );
cv::inRange( imageHSV, cv::Scalar( H_MIN, S_MIN, V_MIN ), cv::Scalar( H_MAX, S_MAX, V_MAX ), imgThreshold0 );
Run Code Online (Sandbox Code Playgroud)
我已经创建了动态轨迹栏以便更改HSV的值,但是我无法获得所需的结果.
是否有关于使用最佳值(也许是过滤器)的建议?
我试图从图像中提取红色.我有代码应用阈值只保留指定范围内的值:
img=cv2.imread('img.bmp')
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,50,50]) #example value
upper_red = np.array([10,255,255]) #example value
mask = cv2.inRange(img_hsv, lower_red, upper_red)
img_result = cv2.bitwise_and(img, img, mask=mask)
Run Code Online (Sandbox Code Playgroud)
但是,正如我检查的那样,红色可以在范围内具有Hue值,比如从0到10,以及在170到180的范围内.因此,我想从这两个范围中的任何一个中保留值.我尝试将阈值从10设置为170并使用cv2.bitwise_not函数,但随后我也获得了所有白色.我认为最好的选择是为每个范围创建一个掩码并使用它们,所以我不得不在继续之前将它们连接在一起.
有没有办法使用OpenCV加入两个面具?或者还有其他方法可以实现我的目标吗?
编辑.我来的不是很优雅,但工作解决方案:
image_result = np.zeros((image_height,image_width,3),np.uint8)
for i in range(image_height): #those are set elsewhere
for j in range(image_width): #those are set elsewhere
if img_hsv[i][j][1]>=50 \
and img_hsv[i][j][2]>=50 \
and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170):
image_result[i][j]=img_hsv[i][j]
Run Code Online (Sandbox Code Playgroud)
它几乎满足了我的需求,而OpenCV的功能可能几乎完全相同,但如果有更好的方法(使用一些专用函数和编写更少的代码),请与我分享.:)
如何定义两种不同颜色的"下"和"上"范围,例如红色和蓝色(因为红色和蓝色在HSV颜色中彼此不相邻)
这个属于红色:
lower_red = np.array([160,20,70])
upper_red = np.array([190,255,255])
Run Code Online (Sandbox Code Playgroud)
这个属于蓝色:
lower_blue = np.array([101,50,38])
upper_blue = np.array([110,255,255])
Run Code Online (Sandbox Code Playgroud)
我尝试使用if条件将它们组合起来或制作自己的功能但不起作用,你们能告诉我解决方案吗?
P/s:Python中的OpenCV
我只是想从自然环境中捕获的图像中仅检测绿色物体.如何定义它?因为在这里我要通过阈值让我们说'x',通过使用这个x我想只获得一种颜色的绿色对象(白色)其他必须出现在另一种颜色(黑色)请指导我做这个.提前致谢.
我编写了下面的代码来检测图像中的 3D 形状,并且它工作正常。
现在我需要检测形状内的颜色并计算它们。
谁能指出我应该从哪里开始进行颜色检测?
下面的形状检测代码,也许会有用:
import cv2
import numpy as np
cv2.imshow('Original Image',rawImage)
cv2.waitKey(0)
hsv = cv2.cvtColor(rawImage, cv2.COLOR_BGR2HSV)
cv2.imshow('HSV Image',hsv)
cv2.waitKey(0)
hue ,saturation ,value = cv2.split(hsv)
cv2.imshow('Saturation Image',saturation)
cv2.waitKey(0)
retval, thresholded = cv2.threshold(saturation, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('Thresholded Image',thresholded)
cv2.waitKey(0)
medianFiltered = cv2.medianBlur(thresholded,5)
cv2.imshow('Median Filtered Image',medianFiltered)
cv2.waitKey(0)
cnts, hierarchy = cv2.findContours(medianFiltered, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
# compute the center of the contour
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
first …Run Code Online (Sandbox Code Playgroud) 我们可以如下定义 HSV 中红色的范围。我想检测某个像素是否是红色的?我怎样才能在Python中做到这一点?我花了一整天,但无法找到解决方案。请解决我的问题。我对 Python 很陌生。我正在使用的代码是:
img=cv2.imread("img.png")
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# lower mask (0-10)
lower_red = np.array([0,50,50])
upper_red = np.array([10,255,255])
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
# upper mask (170-180)
lower_red = np.array([170,50,50])
upper_red = np.array([180,255,255])
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
image_height,image_width,_=img.shape
for i in range(image_height):
for j in range(image_width):
if img_hsv[i][j][1]>=lower_red and img_hsv[i][j][1]<=upper_red:
print("Found red")
Run Code Online (Sandbox Code Playgroud) 我不一定需要源代码,但寻找伪代码或如何解决这个问题的想法。我有一个摄像头对准我的水表,想要将使用情况记录到数据库中。过去几周我一直在使用 OpenCV,并且数字检测工作正常。(最后一个数字会带来问题,因为它会无休止地旋转,而不是像前 5 个那样与数字对齐,因此完整数字的显示时间不到一半。)
无论如何,为了获得最佳分辨率,我想跟踪实际的大红色针。现在我要绕一圈找到“最红”的像素,并用它来计算针的角度。只要光线充足并且相机不移动,它就可以工作。
我猜我可以用 Canny 边缘检测来实现一个技巧......最终我只是想找到最长线的角度?针的颜色独特,应该有助于消除很多误报,但我如何实际应用过滤器呢?
(请注意,仪表左下角有一个红色的小旋转器,与指针的颜色相同。我需要确保它不会误触发某些东西。)