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 thresholds
    params.minThreshold = 10;
    params.maxThreshold = 200;
    # Filter by Area.
    params.filterByArea = True
    params.minArea = 500
    # Filter by Circularity
    params.filterByCircularity = True
    params.minCircularity = 0.8
    # Filter by Convexity
    params.filterByConvexity = True
    params.minConvexity = 0.87
    # Filter by Inertia
    params.filterByInertia = True
    params.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:
        #調整圓度限制,再找一次blob
        if len(keypoints) > 1:
            params.minCircularity = params.minCircularity + step
        else:
            params.minCircularity = params.minCircularity - step
        if 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 = 100
            pointXY = []
            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 pointXY

def 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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章