0

画像からスキューレベルを検出したい。私は次のコードを持っています:

public void analyse(CvMat img) {

    rows = img.rows();
    cols = img.cols();
    // create edge-map from rois
    CvMat edgeMap = cvCreateMat(rows, cols, CV_8UC1);

    cvCanny(img, edgeMap, 100, 400, 3);

    // transform to hough
    CvMemStorage storage = cvCreateMemStorage(0);
    lines = cvHoughLines2(edgeMap, storage, CV_HOUGH_PROBABILISTIC, 1,


    EuclideanDistance euclideanDistance = new EuclideanDistance();
    double maxDistance = Double.MIN_VALUE;
    for (int i = 0; i < lines.total(); ++i) {
        Pointer line = cvGetSeqElem(lines, i);
        CvPoint pt1 = new CvPoint(line).position(0);
        CvPoint pt2 = new CvPoint(line).position(1);
        double distance = euclideanDistance.getDistance(pt1, pt2);
        double currentAngle = Math.atan2(pt2.y() - pt1.y(),
                pt2.x() - pt1.x())
                * 180 / Math.PI;
        System.out.println(currentAngle);
        if (distance > maxDistance) {

            skewAngle = currentAngle;

        }
    }

私のテスト画像は 斜め

スキュー レベルは -16 度だと思いますが、私のコードによると、それは 25 度です...

for も平均角度を 25 で出力します。私のハフパラメータが間違っていますか?

//EDIT ここは houghLines からの描画です ここに画像の説明を入力

挨拶

4

1 に答える 1

0

まず、かなり明確なテキストがあるので、Canny と Hough の前に dilate/erode を使用することをお勧めします。ハフは間違いなく利益を得るでしょう。

次に、線の 2 点間の最大距離として「最適な角度」を選択します。

double distance = euclideanDistance.getDistance(pt1, pt2);
...
if (distance > maxDistance) {
    skewAngle = currentAngle;
}

実際、ハフは、テキストのどの行よりも長い無相関行を検出する可能性があるため、これは機能しません。

ハフ失敗

行われたすべてのステップを自分自身に表示すると、より良いアルゴリズムが得られる可能性があります-キャニーの後に得られるもの、ハフ変換が生成した行など.

于 2012-08-31T11:55:53.700 に答える