2

画像 (80x20 など) のピクセル値を最低から最高に並べ替えようとしています。

以下はいくつかのコードです:

bool sortPixel(int first, int second)
{
    return (first < second);
}

    vector<int>vect_sortPixel;
    for(int y=0; y<height; y++)
    {
        for(int x=0; x<width; x++)
        {
            vect_sortPixel.push_back(cvGetReal2D(srcImg, y, x));
            sort(vect_sortPixel.begin(), vect_sortPixel.end(), sortPixel);
        }
    }

しかし、計算にはかなりの時間がかかります。処理時間を短縮するための提案はありますか? ありがとうございました。

4

2 に答える 2

1

getReal2D を使用しないでください。かなり遅いです。

画像を cv::Mat または Mat に変換します。そのデータ ポインターを使用して、ピクセル値を取得します。Mat.data() は、元の行列へのポインターを提供します。それを使用します。

並べ替えに関する限り、最初にすべてのピクセルの配列を作成し、次にマージ並べ替え (時間複雑度 O(n log n)) を使用して並べ替えることをお勧めします。

#include<opencv2/highgui/highgui.hpp>
#include<stdio.h>
using namespace cv;
using namespace std;
int main()
{
    Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR);
    unsigned char *input = (unsigned char*)(img.data);
    int i,j,r,g,b;
    for(int i = 0;i < img.cols;i++){
            for(int j = 0;j < img.rows;j++){
                b = input[img.cols * j + i] ;
                g = input[img.cols * j+ i + 1];
                r = input[img.cols *j + i +2];
            }
        }
    return 0;
}

これを使用して、メイン マトリックスからピクセル値にアクセスできます。

警告: これは比較対象ではありません。このようなものを使用することで、ピクセル値にアクセスできることをお勧めします。

Mat.data() は、元の行列へのポインターを提供します。この行列は、指定されたすべてのピクセル値を含む 1 次元行列です。

画像 => (x,y,z),(x1,y1,z1) など.

Mat(元の行列) => x,y,z,x1,y1,z1,...

Mat からデータを抽出する方法についてまだ疑問がある場合は、このリンクにアクセスしてくださいOpenCV get pixel channel value from Mat image

ここにマージソートに関するリンクがあります http://www.cplusplus.happycodings.com/Algorithms/code17.html

于 2012-06-23T05:10:09.247 に答える
1

コードにはいくつかの問題があります。

  • Froyoが既に言ったように、これcvGetReal2Dは実際にはあまり高速ではありません。に変換する必要がありcvMatますcv::Mat。これを行うには、cv::Mat コンストラクターがあります。
// converts old-style CvMat to the new matrix; the data is not copied by default
Mat(const CvMat* m, bool copyData=false);

そして、この SO questionで述べたように、直接ピクセルアクセスを使用します。

  • もう 1 つの問題は、push_back実際にはそれほど高速ではない which を使用することです。配列のサイズはわかっているので、最初に必要なメモリを割り当ててみませんか? このような:

vector<int> vect_sortPixel(mat.cols*mat.rows);

そして、vect_sortPixel[i]必要なピクセルを取得するために使用するだけではありません。

  • なぜsortループで呼び出すのですか?配列がすでに作成されている場合は、ループの後に呼び出す必要があります! デフォルトの STL のソートは高速に動作するはずです。

複雑

平均で約 N*logN 回の比較 (N は後から先)。最悪の場合、ライブラリの実装で使用される特定の並べ替えアルゴリズムに応じて、最大 N^2 になります。

于 2012-06-23T07:05:19.050 に答える