nao基於opencv的紅球識別

2021-09-26 16:36:33 字數 3389 閱讀 1248

**如下

# -*- coding: utf-8 -*-

import cv2

import cv2.cv as cv

import numpy as np

from naoqi import alproxy

import vision_definitions

import math

port = 9559 # crf 機械人埠

robot_ip = "192.168.43.56" # crf 機械人ip

cameraproxy = alproxy("alvideodevice", robot_ip, port)

# 基本引數

resolution = vision_definitions.kvga

colorspace = vision_definitions.kbgrcolorspace

fps =20

frameheight = 0

framewidth = 0

framechannels = 0

framearray = none

camerapitchrange = 47.64/180*math.pi

camerayawrange = 60.97/180*math.pi

# 獲取

cameraproxy.setactivecamera(1)

videoclient = cameraproxy.subscribe("python_**m",resolution, colorspace,fps)

frame = cameraproxy.getimageremote(videoclient)

cameraproxy.unsubscribe(videoclient)

#讀取framewidth = frame[0]

frameheight = frame[1]

framechannels = frame[2]

framearray = np.frombuffer(frame[6], dtype=np.uint8).reshape([frameheight, framewidth, framechannels])

# 轉換為hsv

hue_image = cv2.cvtcolor(framearray, cv2.color_bgr2hsv)

# 用顏色分割影象

low_range = np.array([160, 83, 100])

high_range = np.array([180, 255, 255])

th = cv2.inrange(hue_image, low_range, high_range)

cv2.imshow('result', th)

cv2.waitkey(0)

# 平滑處理

gaus=cv2.gaussianblur(th,(7,7),1.5)

cv2.imshow('result', gaus)

cv2.waitkey(0)

# 腐蝕

eroded = cv2.erode(gaus, cv2.getstructuringelement(cv2.morph_ellipse, (4, 4)), iterations=2)

cv2.imshow('result', eroded)

cv2.waitkey(0)

# 膨脹

dilated = cv2.dilate(eroded, cv2.getstructuringelement(cv2.morph_ellipse, (3, 3)), iterations=2)

cv2.imshow('result', dilated)

cv2.waitkey(0)

# hough circle

circles = cv2.houghcircles(dilated, cv.cv_hough_gradient, 1, 100, param1=15, param2=7, minradius=15, maxradius=100)

# 繪製

if circles is not none:

x, y, radius = circles[0][0]

center = (x, y)

cv2.circle(framearray, center, radius, (0, 255, 0), 2)

cv2.imshow('result', framearray)

cv2.waitkey(0)

cv2.destroyallwindows()

在實際應用中可以把繪製的部分和

cv2.imshow('result', framearray)

cv2.waitkey(0)

cv2.destroyallwindows()

刪了,這個主要是測試看效果用的。

另外在不同的場地需要修改下面的值除錯出紅球的顏色

low_range = np.array([160, 83, 100])

high_range = np.array([180, 255, 255])

光線也會對紅球識別有影響,需要在具體的場景臨時除錯

這是我比賽時慘痛的教訓總結出的經驗

這裡面最重要的是

# hough circle

circles = cv2.houghcircles(dilated, cv.cv_hough_gradient, 1, 100, param1=15, param2=7, minradius=15, maxradius=100)

我們主要用霍夫變換識別圓,網上有很多說明,自己搜一搜就知道了,這裡就不再講了。

原圖

二值化

高斯平滑

腐蝕

膨脹

畫圓

其中的處理可以視情況調換順序或者刪除,識別出紅球後的具體定位也需要自行新增演算法,我個人的演算法還不太成熟,所以就不上傳了。

基於Opencv自帶BP網路的車標簡易識別

位址如下 記得把這幾點描述好咯 實現過程 專案檔案結構截圖 演示效果 先將資料集手動劃分成訓練集和測試集,並分好類,比如第一類就放在資料夾名為0的資料夾下,第二類就是1,如此類推。當前程式只能處理10類以下車標,因為當前程式邏輯不支援10以上的數字識別 具體可以仔細看下 所有訓練集的放在train資...

基於Opencv的SIFT SURF HOG的實現

sift實現 surf的實現 include include includeusing namespace std using namespace cv using namespace cv xfeatures2d int main int argc,char ar namedwindow inpu...

基於QT Creator的紅黑樹

採用qt的按鈕實現插入刪除等控制,採用qt的文字框輸出紅黑樹。main.cpp include mainwindow.h int main int argc,char argv w.show return a.exec mainwiindow.cpp include mainwindow.h inc...