- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想开发一个 Python OpenCV 脚本来复制/改进我开发的 Gimp 程序。该过程的目标是提供一个 x,y 点阵列,它遵循草地和硬表面之间的分界线。这个阵列可以让我完成我的 500 磅 54"宽的压力清洗机器人,它有一个 Raspberry Pi Zero(和摄像头),这样它就可以以每秒几英寸的速度跟随那个边缘。我将监视和/或在我在沙发上看电视时通过其 wifi 视频流和 iPhone 应用程序控制机器人。
这是一个示例原始图像(60x80 像素):
Gimp程序是:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="0.833333in" height="1.11111in"
viewBox="0 0 60 80">
<path id="Selection"
fill="none" stroke="black" stroke-width="1"
d="M 60.00,0.00
C 60.00,0.00 60.00,80.00 60.00,80.00
60.00,80.00 29.04,80.00 29.04,80.00
29.04,80.00 29.04,73.00 29.04,73.00
29.04,73.00 30.00,61.00 30.00,61.00
30.00,61.00 30.00,41.00 30.00,41.00
30.00,41.00 29.00,30.85 29.00,30.85
29.00,30.85 24.00,30.85 24.00,30.85
24.00,30.85 0.00,39.00 0.00,39.00
0.00,39.00 0.00,0.00 0.00,0.00
0.00,0.00 60.00,0.00 60.00,0.00 Z" />
</svg>
import numpy as np
import time, sys, cv2
img = cv2.imread('2-60.JPG')
cv2.imshow('Original',img)
# get a blank pntscanvas for drawing points on
pntscanvas = np.zeros(img.shape, np.uint8)
print (sys.version)
if sys.version_info[0] < 3:
raise Exception("Python 3 or a more recent version is required.")
def doredo():
start_time = time.time()
# Use kmeans to convert to 2 color image
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Z = hsv_img.reshape((-1,3))
Z = np.float32(Z)
# define criteria, number of clusters(K)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 2
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
# Create a mask by selecting a hue range around the lowest hue of the 2 colors
if center[0,0] < center[1,0]:
hueofinterest = center[0,0]
else:
hueofinterest = center[1,0]
hsvdelta = 8
lowv = np.array([hueofinterest - hsvdelta, 0, 0])
higv = np.array([hueofinterest + hsvdelta, 255, 255])
mask = cv2.inRange(hsv_img, lowv, higv)
# Extract contours from the mask
ret,thresh = cv2.threshold(mask,250,255,cv2.THRESH_BINARY_INV)
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# Find the biggest area contour
cnt = contours[0]
max_area = cv2.contourArea(cnt)
for cont in contours:
if cv2.contourArea(cont) > max_area:
cnt = cont
max_area = cv2.contourArea(cont)
# Make array of all edge points of the largets contour, named allpnts
perimeter = cv2.arcLength(cnt,True)
epsilon = 0.01*cv2.arcLength(cnt,True) # 0.0125*cv2.arcLength(cnt,True) seems to work better
allpnts = cv2.approxPolyDP(cnt,epsilon,True)
end_time = time.time()
print("Elapsed cv2 time was %g seconds" % (end_time - start_time))
# Convert back into uint8, and make 2 color image for saving and showing
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((hsv_img.shape))
# Save, show and print stuff
cv2.drawContours(pntscanvas, allpnts, -1, (0, 0, 255), 2)
cv2.imwrite("pntscanvas.bmp", pntscanvas)
cv2.imshow("pntscanvas.bmp", pntscanvas)
print('allpnts')
print(allpnts)
print("center")
print(center)
print('lowv',lowv)
print('higv',higv)
cv2.imwrite('mask.bmp',mask)
cv2.imshow('mask.bmp',mask)
cv2.imwrite('CvKmeans2Color.bmp',res2)
cv2.imshow('CvKmeans2Color.bmp',res2)
print ("Waiting for 'Spacebar' to Do/Redo OR 'Esc' to Exit")
while(1):
ch = cv2.waitKey(50)
if ch == 27:
break
if ch == ord(' '):
doredo()
cv2.destroyAllWindows()
Sub BeginFollowingEdgePixel()
Dim lastwasend As Integer
wasinside = False
While (1)
If HitFrontBumper Then
GoTo Hit
Else
Call MoveForward
End If
If circr = orgpos(0) And circc = orgpos(1) Then
orgpixr = -1 'resets Start/Next button to begin at first first found blue edge pixel
GoTo outnow 'this condition indicates that you have followed all blue edge pixels
End If
Call PaintUnderFrontBumperWhite
Call PaintGreenOutsideLeftBumper
nomove:
If NoLeftBumperContact Then
Call MoveLeft
Call PaintUnderLeftBumperWhite
Call PaintGreenOutsideLeftBumper
If NoLeftBumperContact Then
If BackBumperContact Then
Call MakeLeftTheNewForward
End If
End If
ElseIf HitFrontBumper Then
Hit:
Call PaintAheadOfForwardBumperGreen
Call PaintGreenOutsideLeftSide
Call MakeRightTheNewForward
GoTo nomove
Else
Call PaintAheadOfForwardBumperGreen
Call PaintGreenOutsideLeftSide
Call PaintUnderFrontBumperWhite
End If
If (circr = 19 + circrad Or circr = -circrad Or circc = 19 + circrad Or circc = -circrad) Then
If lastwasend = 0 And wasinside = True Then
'finished following one edge pixel
lastwasend = 1
GoTo outnow
Call redrawit
End If
Else
If IsCircleInsideImage Then
wasinside = True
End If
lastwasend = 0
End If
Pause (pausev) 'seconds between moves - Pressing Esc advances early
Wend
outnow:
End Sub
最佳答案
好吧,我终于有时间看看这个了。我将解决您的每一点,然后显示代码中的更改。如果您有任何问题或建议,请告诉我。
...
start_time = time.time()
blur_img = cv2.GaussianBlur(img,(5,5),0) #here
# Use kmeans to convert to 2 color image
hsv_img = cv2.cvtColor(blur_img, cv2.COLOR_BGR2HSV)
...
...
allpnts = cv2.approxPolyDP(cnt,epsilon,True)
new_allpnts = []
for i in range(len(allpnts)):
a = (i-1) % len(allpnts)
b = (i+1) % len(allpnts)
if ((allpnts[i,0,0] == 0 or allpnts[i,0,0] == (img.shape[1]-1)) and (allpnts[i,0,1] == 0 or allpnts[i,0,1] == (img.shape[0]-1))):
tmp1 = allpnts[a,0] - allpnts[i,0]
tmp2 = allpnts[b,0] - allpnts[i,0]
if not (0 in tmp1 and 0 in tmp2):
new_allpnts.append(allpnts[i])
else:
new_allpnts.append(allpnts[i])
...
cv2.drawContours(pntscanvas, new_allpnts, -1, (0, 0, 255), 2)
...
...
#Extract contours from the mask
ret,thresh = cv2.threshold(mask,250,255,cv2.THRESH_BINARY) #here
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
...
...
cv2.imshow('mask.bmp',mask)
res2 = cv2.cvtColor(res2, cv2.COLOR_HSV2BGR)
cv2.imwrite('CvKmeans2Color.bmp',res2)
cv2.imshow('CvKmeans2Color.bmp',res2)
...
关于python - 来自 Gimp 程序的 OpenCV Python 脚本 - 草/硬表面边缘检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51193713/
我有带图层文本的PSD文件,我尝试在Gimp中修改图层文本,但找不到找到选择该文本并将其更改为其他内容的方法。 谢谢你的帮助! 最佳答案 抱歉-GIMP stable无法导入PSD文件的文本信息-这意
我正在使用 GIMP 从命令行运行一个 script-fu 宏。但是,它的启动和运行速度很慢——大约 20-25 秒。我认为大部分时间都花在了启动上——加载所有插件等。在 CL 上优化 GIMP 有哪
有谁知道如何解释 Gimp ggr 渐变文件?一些包含的渐变非常好,我想重建它们。是否有任何脚本可以将这些渐变导出到具有颜色值或其他内容的文件中? 最佳答案 GIMP 渐变对话框中的上下文菜单有两个导
我使用 gimp 创建了自定义画笔。当我尝试将其保存在 gimp 目录中时,出现以下错误。“'C:\Program Files\GIMP 2\share\gimp\2.0\brushes\mybrus
想知道是否有一种简单的方法可以使用 Gimp 删除整个图像宽度上的矩形切片,并自动关闭生成的孔。我希望这是有道理的。如果我在图像上选择一个切片并进行“剪切”,则会在那里留下一个空白的“洞”。我希望图像
我想调整目录中每个 jpg 的大小。 这是我找到的 gimp 脚本。我觉得很明智。 (define (batch-resize pattern) (let* ((filelis
当我打开一个多页 pdf 文件时,gimp 让我选择要导入的页面。打开文件后,所选的第一页出现在文件窗口中。我如何访问其他页面? 谢谢 最佳答案 每个页面都作为一个图层加载。要查看页面,您必须使其上方
我有一个主图像,我在 gimp 中对其进行编辑以获得所需的外观和感觉。然后我想使用 python 脚本来生成一堆文本(在几个不同的层上)改变的新图像。我想留下字体,大小,斜体与否等。 我已使用此功能成
我试图在 GIMP 中打开 *.data 格式的灰度图像,但我得到的唯一选项是多 channel (RGB、RGB alpha 等)。有办法改变这个吗?谢谢。 最佳答案 文件->打开 选择 Raw i
我正在使用由照片软件 gimp 调用的 python 脚本将 pdf 转换为 jpg。到目前为止,该脚本运行良好,但完成后,gimp 会打开一个 cmd 窗口,提示“按任意键退出”。这个 cmd 窗口
我在 OS X 上的 GIMP 2.8.14 中使用 Python-Fu 来自动化我的游戏 Assets 管道生产。 但我注意到方法 pdb.gimp_image_scale与内置功能“Image >
我正在为 GIMP 开发一个 python 插件,我想获取一个图层的 RGB 矩阵作为一个 numpy 数组。要访问 python 插件中的层,我使用下一个代码: def python_functio
我尝试在 OSX 上构建 GIMP 2.10 已经一周了,但没有成功。大多数问题都是不同的依赖关系等等。虽然这需要时间,但所有这些都是可以解决的,但现在我认为我走到了死胡同。我已经到了最终可以运行“m
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我在使用 gimp 批处理模式时遇到了问题。我想要做的就是打开 2 个 png 文件作为一个图像的图层,并将它们一起保存为图标 (.ico)。 问题:Gimp 只是将两个图像作为单独的窗口打开,而不是
我有一个包含 20 多个层的 .xcf 文件,我用它来制作 Sprite 文件。 我想将所有这些图层保存到单独的文件中,其中只有每个图层的内容和大小。 我为 gimp 找到了这个脚本:https://
在 Gimp 中,我创建了一个包含大约 200 个层的 .xcf 文件。有些是可见的,有些则不是。现在我想创建一个包含所有图层的图片,所以我必须让所有图层都可见。稍后我将不得不返回某些图层可见而某些图
我有一系列 .xcf 图像,我想将它们另存为 .png。我可以打开每个文件并另存为 .png,但由于图像很多,因此需要相当长的时间。 有没有办法一次转换所有图像,或者另一种方法我必须在这项工作上花费更
我正在为 Blender 编写一个附加组件以将其与 Gimp 同步,并且该脚本应该能够从 Gimp 内启动,但我无法注册它...为什么? blender_gimp_sync.py: # -*- cod
我使用 Gimp 将一个 PNG 导出到另一个没有来自透明像素的颜色值的 PNG。有没有办法从命令行做同样的事情?我将从 php 中使用此脚本。Gimp UI 中的选项未选中“保存透明像素的颜色值”。
我是一名优秀的程序员,十分优秀!