7

OpenCVで画像を読み取り、そのサイズを取得してサーバーに送信する必要があります。これにより、画像が処理され、抽出された特徴が返されます。

を使用することを考えていましたvector<byte>が、データをcv::Matにコピーする方法がわかりません。高速にしたくないので、ポインターを使用してデータにアクセスしようとしていますが、実行時の例外があります。私はこのようなものを持っています。

Mat image = imread((path + "name.jpg"), 0);
vector<byte> v_char;
for(int i = 0; i < image.rows; i++)
    {   
        for(int j = 0; j < image.cols; j++)
        {
            v_char.push_back(*(uchar*)(image.data+ i + j));             

        }           
    }
  • このタスクに最適なアプローチはどれですか?
4

4 に答える 4

9

直接アクセスはOpenCVにとって最速であるため良い考えですが、あなたはそのステップを逃しており、それがおそらくあなたのプログラムが壊れている理由です。次の行は間違っています:

v_char.push_back(*(uchar*)(image.data+ i + j)); 

iをインクリメントする必要はありません。i+image.stepをインクリメントする必要があります。これは次のようになります。

Mat image = imread((path + "name.jpg"), 0);
vector<byte> v_char;
for(int i = 0; i < image.rows; i++)
    {   
        for(int j = 0; j < image.cols; j++)
        {
            v_char.push_back(*(uchar*)(image.data+ i*image.step + j));             

        }           
    }
于 2012-10-02T14:32:24.890 に答える
8

あなたはこれまで素晴らしい答えを受け取りましたが、これはあなたの主な問題ではありません。サーバーに画像を送信する前におそらくやりたいことは、画像を圧縮することです。

cv::imencode()それで、それを圧縮する方法と、それcv::imdecode()をサーバーのOpenCVマトリックスに戻す方法を見てみましょう。imencode ouptutをソケットにプッシュするだけで、完了です。

于 2012-10-03T06:14:51.563 に答える
7

Jav_Rockの答えを改善する方法は次のとおりです。

Mat image = ...;
vector<byte> v_char(image.rows * image.cols);

for (int i = 0; i < image.rows; i++)
  memcpy(&v_char[i * image.cols], image.data + i * image.step, image.cols);

編集:コンストラクターによる初期化は、余分な再割り当てを回避するために十分なスペースを割り当てますが、ベクター内のすべてのアイテムをデフォルト値(0)に設定します。次のコードは、この余分な初期化を回避します。

Mat image = ...;
vector<byte> v_char;
v_char.reserve(image.rows * image.cols);

for (int i = 0; i < image.rows; i++)
{
  int segment_start = image.data + i * image.step;
  v_char.insert(v_char.end(), segment_start, segment_start + image.cols);
}
于 2012-10-02T15:39:35.500 に答える
0

ベクトルを使用する必要がある理由を完全には理解していませんが、本当に必要な場合は、単純なmemcpyを実行することをお勧めします。

vector<byte> v_char(image.width * image.height); //Allocating the vector with the same size of the matrix
memcpy(v_char.data(), image.data, v_char.size() * sizeof(byte)); 
于 2012-10-02T15:16:37.960 に答える