0

私は現在、openCV-lib (バージョン 2.1) を使用して c++ でアプリケーションを作成しています。タスクは、このライブラリの機能のいくつかを使用して、学生プロジェクトとして小さなデータベースを実装することでした。median-filter と boxcar-filter の私自身の実装では、 cv::Mat::at メソッドを使用して、特定の画像内の単一のピクセルに読み取りと書き込みの両方の操作でアクセスします。

これに関する興味深い点は、小さな画像で完璧に機能することです。ただし、より大きな画像のみ、常に同じ座標で常にSIGSEGVを生成します。

これは既知のバグですか、それとも本当に間違ったことをしていますか?

ここに私が書いた最も重要な関数があります:

class point {
public:
    int x,y;
};

class ImageEntry {  
    friend class ImageDB;
private:
    string _key;
    string _filename;
    Mat *_data;
    ImageEntry* _next;
    void show(void);
public:
    void operator<<(ImageFilter* x);
    ~ImageEntry();  
    ImageEntry(string filename, string key);
    Vec3b GetPoint(int x, int y);
    point GetSize(void);
    void SetPoint(int x, int y, Vec3b color);
};


point ImageEntry::GetSize(void) {
    point iRet;
    iRet.x = _data->cols;
    iRet.y = _data->rows;
    return iRet;
}

Vec3b ImageEntry::GetPoint(int x, int y) {
    Vec3b iRet;
    iRet = _data->at<Vec3b>(x,y);
    return iRet;
}

void ImageEntry::SetPoint(int x, int y, Vec3b color) {
    _data->at<Vec3b>(x,y) = color;
}

void MedianFilter::filterImage(ImageEntry* img) {
    Vec3b Points[9];
    Vec3b NewColor;

    unsigned char ActChan[9];
    point range = img->GetSize();
    for (int act_x = 1; act_x < (range.x - 1); act_x++) {
        for (int act_y = 1; act_y < range.y - 1; act_y++) {
            Points[0] = img->GetPoint(act_x-1,act_y-1);
            Points[1] = img->GetPoint(act_x,act_y-1);
            Points[2] = img->GetPoint(act_x+1,act_y-1);
            Points[3] = img->GetPoint(act_x-1,act_y);
            Points[4] = img->GetPoint(act_x,act_y);
            Points[5] = img->GetPoint(act_x+1,act_y);
            Points[6] = img->GetPoint(act_x-1,act_y+1);
            Points[7] = img->GetPoint(act_x,act_y+1);
            Points[8] = img->GetPoint(act_x+1,act_y+1);

            for (int act_color = 0; act_color < 3; act_color++) {
                for (int i = 0; i < 9; i++) ActChan[i] = Points[i][act_color];
                SelSort9(ActChan);
                NewColor[act_color] = ActChan[4];
            }
            img->SetPoint(act_x,act_y,NewColor);
        }
    }
}

どんな提案でも本当に感謝します。お時間をいただきありがとうございます!

4

1 に答える 1

2

OpenCv のドキュメントでat()SetPoint() メソッドで使用するfunction を見ると、次のように書かれています。

template<typename _Tp> _Tp& Mat::at(int i, int j)

指定された行列要素への参照を返します。パラメーター:

i – The 0-based row index
j – The 0-based column index

さらに、GetSize() メソッドを見ると、設定iRet.y = _data->rowsしてから、メソッドfilterImage()で for ループを使用して from をループしますact_y = 1 to iRet.y。2 番目のループは、行をループします。このメソッドの最後に を呼び出しますSetPoint(act_x, act_y)。これは、順番にat(act_x, act_y)基本的に呼び出します。

act_yこれは行のインデックスでしたが、現在は列のインデックスとして使用されていることを思い出してください。この提案が問題を解決するために必要なすべてであることを願っています。

于 2012-04-16T23:52:28.320 に答える