6

別の輪郭内の輪郭を識別する方法は? 多くの OpenCV チュートリアルを実行しようとしましたが、それを特定できませんでした。専門家がそれを説明するための簡単なコードを提供できますか?

これは私の入力ファイルです

ここに画像の説明を入力

この暗い部分は、特定する必要がある輪郭です。

ここに画像の説明を入力

あなたの経験を私と共有するのに十分親切にしてください.

4

2 に答える 2

3

JavaCVにはあまり慣れていないので、OpenCVとC(古いもの)でこの問題を解決する方法を次に示します。

  1. を使用して、画像内のすべての輪郭を見つけます。cvFindContours()
  2. これらの輪郭に対して2 つのループ (反復ポインターh_nextまたは JavaCV にあるもの) を実行します。外側のループの各輪郭について、 に基づいて検出された他のすべての輪郭と一致させます。. .
  3. 各輪郭の境界ボックスを計算します。これがCvRect構造体になります。
  4. CvRects2 つの長方形の交差 (重なり) の面積を計算する関数に 2 つを渡します。
  5. この面積が 2 つの長方形の小さい方の面積と等しい場合、小さい方の長方形に対応する輪郭は、大きい方の長方形によって完全に囲まれます。

    交差領域を見つけるためのコードを次に示します。どこかでウェブ上に浮かんでいたに違いありません。

    CvRect intersect(CvRect r1, CvRect r2) { CvRect intersection;

    // find overlapping region
    intersection.x = (r1.x < r2.x) ? r2.x : r1.x;
    intersection.y = (r1.y < r2.y) ? r2.y : r1.y;
    intersection.width = (r1.x + r1.width < r2.x + r2.width) ?
        r1.x + r1.width : r2.x + r2.width;
    intersection.width -= intersection.x;
    intersection.height = (r1.y + r1.height < r2.y + r2.height) ?
        r1.y + r1.height : r2.y + r2.height;
    intersection.height -= intersection.y;    
    
    // check for non-overlapping regions
    if ((intersection.width <= 0) || (intersection.height <= 0)) {
        intersection = cvRect(0, 0, 0, 0);
    }
    
    return intersection;
    

    }

于 2012-07-13T04:23:13.237 に答える
2

Python コードでの簡単なアプローチを次に示します。( But as I stated in my comment below, It is not an universal answer applicable everywhere, It is just to show finding contour inside a contour can be done. And if your images are different, then you have to come with some different constraints other than i mentioned below)

輪郭を見つけた後に行っていることは、各輪郭の面積が指定された値(10000を与えた、単なる推測)未満であるかどうかを確認し、そうでない場合は輪郭が大きい場合は回避することです。指定された値よりも小さい場合は、その隣の正方形または長方形である可能性があります。

したがって、幅と高さを見つけて、アスペクト比が 1 に近いかどうかを確認します。そうであれば、それが正方形です。

import cv2
import numpy as np

img = cv2.imread('sofcnt.jpg')
gray = cv2.imread('sofcnt.jpg',0)

ret,thresh = cv2.threshold(gray,127,255,1)

cont,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in cont:
    approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True)
    if cv2.contourArea(cnt) < 10000:
        x,y,w,h = cv2.boundingRect(cnt)
        if w/float(h) < 2:
            cv2.drawContours(img,[cnt],0,255,-1)


cv2.imshow('a',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果 :

ここに画像の説明を入力

于 2012-07-12T14:40:49.250 に答える