Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用opencv确定产品的拾取和放置方向_Python_Opencv - Fatal编程技术网

Python 使用opencv确定产品的拾取和放置方向

Python 使用opencv确定产品的拾取和放置方向,python,opencv,Python,Opencv,我正在尝试检测产品的方向,因此我可以将此方向用于拾取和放置系统 我能检测出产品的轮廓 我可以计算出轮廓的中心 我可以通过在轮廓上拟合一个椭圆来计算角度,但是结果并不稳定 问题在于角度的确定,因为产品在上侧和下侧也是最理想的质量方向。通过拟合elipse计算角度是不稳定的。有时向量指向左边,有时指向右边。如下图所示,您可以在下图()中看到绘制的角度线并不总是指向同一方向 以下是我目前的代码: import cv2 import numpy as np import math # read t

我正在尝试检测产品的方向,因此我可以将此方向用于拾取和放置系统

  • 我能检测出产品的轮廓
  • 我可以计算出轮廓的中心
  • 我可以通过在轮廓上拟合一个椭圆来计算角度,但是结果并不稳定
问题在于角度的确定,因为产品在上侧和下侧也是最理想的质量方向。通过拟合elipse计算角度是不稳定的。有时向量指向左边,有时指向右边。如下图所示,您可以在下图()中看到绘制的角度线并不总是指向同一方向

以下是我目前的代码:

import cv2
import numpy as np
import math

# read the image

cap = cv2.imread("20190909_170137.jpg")

def nothing(x):
  pass

# create slider
cv2.namedWindow("Trackbars")
hh='Max'
hl='Min'
wnd = 'Colorbars'

cv2.createTrackbar("threshold", "Trackbars", 150, 255, nothing)
cv2.createTrackbar("Houghlines", "Trackbars", 255, 255, nothing)


while True:
    frame = cv2.imread("20190909_170137.jpg", cv2.IMREAD_COLOR)

    scale_percent = 60 # percent of original size
    width = int(frame.shape[1] * scale_percent / 100)
    height = int(frame.shape[0] * scale_percent / 100)
    dim = (width, height)

    # resize image
    frame = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)

    # create sliders for variables
    l_v = cv2.getTrackbarPos("threshold", "Trackbars")
    u_v = cv2.getTrackbarPos("Houghlines", "Trackbars")

    #convert frame to Black and White
    bw = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    #convert Black and White to binary image
    ret,thresh4 = cv2.threshold(bw,l_v,255,cv2.THRESH_BINARY)

    #find the contours in thresh4
    im2, contours, hierarchy = cv2.findContours(thresh4, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

    #calculate with contour
    for contour in contours:
        #calculate area and moment of each contour
        area = cv2.contourArea(contour)
        M = cv2.moments(contour)

        if M["m00"] > 0:
            cX = int(M["m10"] / M["m00"])
            cY = int(M["m01"] / M["m00"])


        #Use contour if size is bigger then 1000 and smaller then 50000
        if area > 1000:
            if area <50000:
                approx = cv2.approxPolyDP(contour, 0.001*cv2.arcLength(contour, True), True)
                #draw contour
                cv2.drawContours(frame, contour, -1, (0, 255, 0), 3)
                #draw circle on center of contour
                cv2.circle(frame, (cX, cY), 7, (255, 255, 255), -1)
                perimeter = cv2.arcLength(contour,True)
                approx = cv2.approxPolyDP(contour, 0.04 * perimeter, True)
                #fit elipse
                _ ,_ ,angle = cv2.fitEllipse(contour)
                P1x = cX
                P1y = cY
                length = 35

                #calculate vector line at angle of bounding box
                P2x = int(P1x + length * math.cos(math.radians(angle)))
                P2y = int(P1y + length * math.sin(math.radians(angle)))
                 #draw vector line
                cv2.line(frame,(cX, cY),(P2x,P2y),(255,255,255),5)

                #output center of contour
                print  (P1x , P2y, angle)

                #detect bounding box
                rect = cv2.minAreaRect(contour)
                box = cv2.boxPoints(rect)
                box = np.int0(box)
                #draw bounding box
                cv2.drawContours(frame, [box],0,(0,0,255),2)

                #Detect Hull
                hull = cv2.convexHull(contour)
                #draw line
                #img_hull = cv2.drawContours(frame,[hull],0,(0,0,255),2)


      #print (angle)
    #    print (p)

        cv2.imshow("Frame", thresh4)
        key = cv2.waitKey(1)
        cv2.imwrite('thresh4.png',thresh4)
        key = cv2.waitKey(1)
        cv2.imshow("bw2", frame)
        key = cv2.waitKey(1)
        cv2.imwrite('box.png',frame)
        key = cv2.waitKey(1)
        key = cv2.waitKey(1)
        #if key == 27:
         #   break
        break
    #cap.release()
    cv2.destroyAllWindows()
导入cv2
将numpy作为np导入
输入数学
#阅读图片
cap=cv2.imread(“20190909_170137.jpg”)
def nothing(x):
通过
#创建滑块
cv2.namedWindow(“轨迹栏”)
hh='Max'
hl='Min'
wnd='颜色条'
cv2.createTrackbar(“阈值”,“轨迹栏”,150255,无)
cv2.createTrackbar(“Houghlines”,“trackbar”,255,255,nothing)
尽管如此:
frame=cv2.imread(“20190909_170137.jpg”,cv2.imread_颜色)
比例百分比=原尺寸的60
宽度=整数(框架形状[1]*比例百分比/100)
高度=整数(框架形状[0]*比例百分比/100)
尺寸=(宽度、高度)
#调整图像大小
帧=cv2.调整大小(帧、尺寸、插值=cv2.内部区域)
#为变量创建滑块
l_v=cv2.getTrackbarPos(“阈值”、“轨迹栏”)
u_v=cv2.getTrackbarPos(“Houghlines”、“trackbar”)
#将帧转换为黑白
bw=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY)
#将黑白图像转换为二值图像
ret,thresh4=cv2.threshold(bw,l_v,255,cv2.THRESH_二进制)
#在图4中找到轮廓
im2,轮廓,层次=cv2.findContours(阈值4,cv2.RETR\u列表,cv2.CHAIN\u近似值\u无)
#用等高线计算
对于等高线中的等高线:
#计算每个轮廓的面积和力矩
面积=cv2。轮廓面积(轮廓)
M=cv2.力矩(轮廓)
如果M[“m00”]>0:
cX=int(M[“m10”]/M[“m00”])
cY=int(M[“m01”]/M[“m00”])
#如果尺寸大于1000,小于50000,则使用轮廓
如果面积>1000:

如果区域,矩形或椭圆的一个轴的角度将不确定为角度或角度+180度,除非您可以识别对象的一端与另一端不同。这是正确的,也是我的问题。我不知道如何检测物体两端的差异。如果我能分辨出物体的两端,我就能计算出方向。我想你需要做些什么来计算旋转。你也可以去上班,但这并不优雅。您必须制作模板图像的多个旋转副本,并针对每个旋转角度运行matchTemplate。感谢您的回复,我已经尝试了这两个选项,但无法使它们正常工作。我甚至试着用haar cascades来探测物体的一部分,但也没用。不过,我会再次研究它们,看看是否能找到一个可行的建议解决方案。矩形或椭圆的一个轴的角度将不确定为角度或角度+180度,除非你能确定物体的一端与另一端不同。这是正确的,也是我的问题。我不知道如何检测物体两端的差异。如果我能分辨出物体的两端,我就能计算出方向。我想你需要做些什么来计算旋转。你也可以去上班,但这并不优雅。您必须制作模板图像的多个旋转副本,并针对每个旋转角度运行matchTemplate。感谢您的回复,我已经尝试了这两个选项,但无法使它们正常工作。我甚至试着用haar cascades来探测物体的一部分,但也没用。不过,我会再次研究这些建议,看看能否找到一个可行的解决办法。