我使用 opencv python 形式将模拟时钟转换为小时和分钟的数字数据,但我也需要它显示几秒钟

问题描述

我使用 opencv 读取图像,将其转换为灰度,并使用 canny、kernel、thesh、erode 等找到边缘,我使用 HooughLineP() 检测到图像中的所有线条,并且检测到时针和分针,但我还需要找到秒针,这是我使用的代码

import cv2
import math
import numpy as np
from matplotlib import pyplot as plt
from math import sqrt
from math import acos,degrees


kernel = np.ones((5,5),np.uint8)
img1 = cv2.imread('input1.jpg')
img = cv2.imread('input1.jpg',0)
gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(gray,50,255,cv2.THRESH_BINARY)

# Create mask
height,width = img.shape
#height=height-10
#width=width-10
mask = np.zeros((height,width),np.uint8)

edges = cv2.Canny(thresh,100,200)

#cv2.imshow('detected ',gray)
cimg=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1.2,100)
#circles = cv2.HoughCircles(edges,1000,param1 = 50,param2 = 30,minRadius = 20,maxRadius = 0)
for i in circles[0,:]:
    i[2]=i[2]+4
    # Draw on mask
    cv2.circle(mask,(i[0],i[1]),i[2],(255,255),thickness=-1)

# Copy that image using that mask
masked_data = cv2.bitwise_and(img1,img1,mask=mask)

# Apply Threshold
_,thresh = cv2.threshold(mask,1,cv2.THRESH_BINARY)
# Find Contour
contours = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])

# Crop masked_data
crop = masked_data[y+30:y+h-30,x+30:x+w-30]
i=crop
height,width,channels = i.shape
print (width,height,channels)
#########################################################################

ret,mask = cv2.threshold(i,10,cv2.THRESH_BINARY)
edges = cv2.Canny(i,200)
kernel = np.ones((11,11),np.uint8)
kernel2 = np.ones((13,13),np.uint8)
edges = cv2.dilate(edges,kernel,iterations = 1)
edges = cv2.erode(edges,kernel2,iterations = 1)
minLineLength = 1000
maxLineGap = 10
lines = cv2.HoughLinesP(edges,np.pi/180,15,minLineLength,maxLineGap)
h=[]
xmax1=0
xmax2=0
ymax1=0
ymax2=0
xs1=0
xs2=0
ys1=0
ys2=0

for line in lines:
    x1,y1,x2,y2 = line[0]
    #cv2.line(i,(x1,y1),(x2,y2),(0,0),1)
    dx=x2-x1
    if(dx<0):
        dx=dx*-1
    dy=y2-y1
    if(dy<0):
        dy=dy*-1
        
    hypo=sqrt(dx**2 + dy**2)
    
            
    #print("dx=",dx,"  dy=",dy)
    h.append(hypo)

#print(h)
print(len(h))
a=len(h)
h.sort(reverse=True)
#print(h)
m=0
k=0

for f in range(a):
    for line in lines:
        x1,y2 = line[0]
        #cv2.line(i,3)
        dx=x2-x1
        if(dx<0):
            dx=dx*-1
        dy=y2-y1
        if(dy<0):
            dy=dy*-1

        hypo2=sqrt(dx**2 + dy**2)


        if(hypo2==h[0]):
            m=hypo2
            xmax1=x1
            xmax2=x2
            ymax1=y1
            ymax2=y2
            cv2.line(crop,(xmax1,ymax1),(xmax2,ymax2),3)
            #print("xmax1=",xmax1," ymax1=",ymax1," xmax2=",xmax2," ymax2=",ymax2)

        if(m==h[0]): 
            if(hypo2==h[f]):
                if((sqrt((xmax2-x2)**2 + (ymax2-y2)**2))>20):
                    if((sqrt((xmax1-x1)**2 + (ymax1-y1)**2))>20):
                        xs1=x1
                        xs2=x2
                        ys1=y1
                        ys2=y2
                        cv2.line(crop,(xs1,ys1),(xs2,ys2),3)
                        print("xs1=",xs1," ys1=",ys1," xs2=",xs2," ys2=",ys2)
                        k=1
                        break
    if(k==1):                
        break           

print("xmax1=",ymax2)

我在上面的代码行中将分针和时针分开,但我也需要分开秒针,请任何人帮助我!

Click here for the sample input image

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)