2017-03-15 30 views
2

私は、ページ上の図形の端を検出し、その図形を拡大縮小するために画像を切り取ってラップするプログラムに取り組んでいます。しかし、問題は、私の形が各コーナーのマーカーだけで結ばれていることです。続いて、私はで動作するようにしようとしている例の画像です:OpenCVで不完全な形状のコーナーをPythonで検出する

Example

どのように私は、画像の四隅を決定することができるだろうか?私は輪郭解析やフィーチャマッチングアルゴリズムを試しましたが、どれも私に必要な信頼性を与えてくれませんでした。

私は一般的にCVを初めて使い慣れているので、私の正確な問題を解決できる便利な機能はありますか?

ありがとうございます!

EDIT

Image Raw

+0

あなたは 'cv2.goodFeaturesToTrackを()'チェックアウトしましたか? –

答えて

0

私はcv2.goodFeaturesToTrack()を使用してみます:変数の照明のためには、私は私が対処しようとしているものの例の画像を追加しました。あなたは、文字通り/これは私はあなたがバイラテラルフィルタとgoodFeaturesToTrackパラメータでプレイすることをお勧めしますresults

を得るものであるOpenCVのドキュメントLINK

import numpy as np 
import cv2 
import matplotlib.pyplot as plt 

img = cv2.imread('test.png') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
blur = cv2.bilateralFilter(gray, 16, 50, 50) 

corners = cv2.goodFeaturesToTrack(blur, 40, 0.1, 10) 
corners = np.int0(corners) 

for i in corners: 
    x,y = i.ravel() 
    cv2.circle(img,(x,y),3,255,-1) 

plt.circle(img, (x, y), 3, 255, -1) 
plt.show() 

からコードをコピー&ペーストすることができます。

もう1つの選択肢は、コーナーのマッチフィルターを使用することです(単語のすべてのヒットを取得しないように)。

+0

私はトラックに良い機能を使用しようとしましたが、2番目の私は実際の世界の写真(電話などから)を取った、照明のグラジエントは本当にgoodFeaturesToTrackに苦労しました。私は、 – agupta231

+0

を参照してください。良いイルミネーションは処理をもっと簡単にしますが、BilateralFilterは少し助けになります。これらの現実世界の画像を共有できますか? –

+0

元の投稿を修正し、サンプル画像を追加しました。 – agupta231

0

cv2.findContours()を使用して、指定した画像内のすべての輪郭を見つけて、各輪郭の境界矩形を見つけ、すべての輪郭矩形の中でminX、minY、maxX、maxYを見つけると、外側の境界矩形はすべての小さな輪郭をカバーし、したがってあなたの望む結果をカバーします。

import cv2 
import numpy as np 

img = cv2.imread("/Users/anmoluppal/Downloads/mjut8.png", 0) 

# Threshold and Invert the image to find the contours 
ret, thresh = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY_INV) 

# Find the contours 
im, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

x, y, r, b = [img.shape[1]/2, img.shape[0]/2, 0, 0] 
# Iterate over all the contours, and keep updating the bounding rect 

for cnt in contours: 
    rect = cv2.boundingRect(cnt) 
    if rect[0] < x: 
     x = rect[0] 
    if rect[1] < y: 
     y = rect[1] 
    if rect[0] + rect[2] > r: 
     r = rect[0] + rect[2] 
    if rect[1] + rect[3] > b: 
     b = rect[1] + rect[3] 

bounding_rect = [x, y, r-x, b-y] 

# Debugging Purpose. 
cv2.rectangle(img, (x, y), (r, b), np.array([0, 255, 0]), 3) 

enter image description here

関連する問題