本文主要是介绍Pyhton3+openCV3初体验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
其中python3采用的anaconda进行Python的安装与库的管理。
安装好anaconda后,就可以通过anaconda来安装opencv了。打开Anaconda Prompt命令行程序,输入conda list,可以查看已安装的库。
输入conda install --channel https://conda.anaconda.org/menpo opencv3 可以对opencv进行安装。
安装好的环境通过测试表明安装无误~
import cv2
import numpy as np#找到输入图像中接近于圆的blob
def getBlob(img):step = 0.05# Setup SimpleBlobDetector parameters.params = cv2.SimpleBlobDetector_Params()# Change thresholdsparams.minThreshold = 10;params.maxThreshold = 200;# Filter by Area.params.filterByArea = Trueparams.minArea = 500# Filter by Circularityparams.filterByCircularity = Trueparams.minCircularity = 0.8# Filter by Convexityparams.filterByConvexity = Trueparams.minConvexity = 0.87# Filter by Inertiaparams.filterByInertia = Trueparams.minInertiaRatio = 0.01# Set up the detector with default parameters.ver = (cv2.__version__).split('.')if int(ver[0]) < 3 :detector = cv2.SimpleBlobDetector(params)else : detector = cv2.SimpleBlobDetector_create(params)# Detect blobs.keypoints = detector.detect(img)#print (keypoints,type(keypoints[0]))#圆度限制为0.8.若只找到一个圆则返回。若未找到圆则降低圆度限制再试一次。若找到多个,则返回半径最接近的。if len(keypoints) == 1:if keypoints[0].size >26 and keypoints[0].size < 34: return [int(keypoints[0].pt[0]), int(keypoints[0].pt[1])]else:return [0,0]else:#调整圆度限制,再找一次blobif len(keypoints) > 1:params.minCircularity = params.minCircularity + stepelse:params.minCircularity = params.minCircularity - stepif int(ver[0]) < 3:detector = cv2.SimpleBlobDetector(params)else : detector = cv2.SimpleBlobDetector_create(params)keypoints = detector.detect(img)if len(keypoints) == 1:if keypoints[0].size >26 and keypoints[0].size < 34: return [int(keypoints[0].pt[0]), int(keypoints[0].pt[1])]else:return [0,0]elif len(keypoints) == 0:return [0,0]else:minR = 100pointXY = []for i in range(len(keypoints) - 1):if abs(keypoints[i].size - 30) > minR:pointXY = [int(keypoints[i].pt[0]), int(keypoints[i].pt[1])]minR = abs(keypoints[i].size - 30)return pointXYdef getCirclesByHoughCircles(img):#canny边缘检测image = cv2.Canny(image3, 200, 300)print ("边缘检测后",image[120,114], image[120,115], image[120,116], image[120,117], image[120,118], image[120,119], image[120,120])#保存图片#cv2.imwrite("canny.jpg", cv2.Canny(image, 200, 300))#弹出窗口显示图片#cv2.imshow("image", image)#cv2.waitKey (0)#cv2.destroyAllWindows() #houghCircles查找圆#HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles#params-image:灰度图#params-method:使用的检测方法#params-dp:累加器。1表示累加器和输入图像有相同的分辨率。2表示累加器有输入图像高宽的一半大小#params-minDist:两个不同圆之间的最小距离#params-params1:#params-params2:#params-minRadius:圆半径的最小值#params-maxRadius:圆半径的最大值circlesHoughCirResult = cv2.HoughCircles(topLeftRoi, cv2.HOUGH_GRADIENT, 10, 50, param1=100, param2=100, minRadius=10, maxRadius=40)print ("HoughCircles找到的结果:",circlesHoughCirResult.shape)#该算法可能会找到很多根本不存在的圆。所以我们接下来计算圆度,来筛选出符合要求的圆circlesHoughCirResult_check = []for i in range(circlesHoughCirResult[:,:,0].size): if image3[int(circlesHoughCirResult[:,i,:][0,0]),int(circlesHoughCirResult[:,i,:][0,1])] == 0 and circlesHoughCirResult[:,i,:][0,2] > 13 and circlesHoughCirResult[:,i,:][0,2] < 17:circlesHoughCirResult_check.append(circlesHoughCirResult[:,i,:])return circlesHoughCirResult_check#加载图片,imread第二个参数为0表示读入的为灰度图
image3=cv2.imread('Y:/1.tif',0)
print ("opencv加载后的数组类型:",type(image3),";","数组形状:",image3.shape)#自适应阈值二值化
#adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
#params-src:原始图像
#params-maxValue:像素的上限值
#params-adaptiveMethod:自适应的方法。#cv2.ADAPTIVE_THRESH_MEAN_C为邻域内均值、cv2.ADAPTIVE_THRESH_GAUSSIAN_C为邻域内像素点加权和,权重为一个高斯窗口
#params-thresholdType:赋值方法。cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
#params-blockSize:邻域大小
#params-C[,dst]:常数C。阈值等于均值或者加权值减去这个常数。
image2 = cv2.adaptiveThreshold(image3, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 2)#img[高,宽]
print (image2[120,114], image2[120,115], image2[120,116], image2[120,117], image2[120,118], image2[120,119], image2[120,120])
topLeftRoi = image2[:300,:300]
#霍夫变换找圆
circlesHoughCirResult_check = getCirclesByHoughCircles(topLeftRoi)
print (circlesHoughCirResult_check)
topLeftRoi = cv2.Canny(topLeftRoi, 200, 300)
print (getBlob(topLeftRoi))
输出:
opencv加载后的数组类型: <class 'numpy.ndarray'> ; 数组形状: (2232, 1584)
255 255 0 0 0 0 0
边缘检测后 0 255 0 0 0 0 0
HoughCircles找到的结果: (1, 6, 3)
[array([[ 125. , 125. , 14.14213467]], dtype=float32)]
[127, 125]
这篇关于Pyhton3+openCV3初体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!