bugfix> c > 投稿

私は、bmpファイルから12桁のバーコードを取得する方法についてのガイダンスが必要です。これにどのようにアプローチするかについてはまったくわかりません。 画像をビットマムに読み込むことから始めましたが、どうすれば続行できますか?

例:下の画像のバーコードは081034489030です。 これらの番号を取得する方法は?

void part1() {
int  width, height;
unsigned char ** img = NULL;
img = readBMP("package.bmp", &height, &width);
}
unsigned char**  readBMP(char* filename, int* height_r, int* width_r)
{
int i, j;
FILE* f;
fopen_s(&f,filename, "rb");
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header
                                           // extract image height and width 
//from header
int width = *(int*)&info[18];
int height = *(int*)&info[22];
int pad_needed = 4 - (3 * width) % 4;   // pad calculation
int paddedRow = 3 * width + ((pad_needed != 4) ? pad_needed : 0);
unsigned char** map2d = (unsigned char**)malloc(width * sizeof(unsigned 
char*)); // alocate memory for img 2d array
for (i = 0; i < width; i++) {
    map2d[i] = (unsigned char*)malloc(height * sizeof(unsigned char));
}
unsigned char* data = (unsigned char*)malloc(paddedRow * sizeof(unsigned 
char));  // allocate memory for each read from file
for (i = 0; i < height; i++) {
    fread(data, sizeof(unsigned char), paddedRow, f); //read line from file
    for (j = 0; j < width; j++) {
        map2d[j][i] = (int)data[3 * j]; // insert data to map2d. jump 3, 
           //becasue we need only one value of the colors (RGB)
    }
}
free(data);
fclose(f);
*width_r = width;
*height_r = height;
return map2d;
}

回答 1 件
  • コンピュータービジョン技術を以下に適用する必要があります。

    画像からバーコードを分割する

    アプリケーションでさらに使用できるように、バーコード情報をデコードします。

    この問題に対する単一の答えはありません。また、間違いなくワンライナーではありません。

    始める方法は、OpenCVのような専用のコンピュータービジョンライブラリを使用することです。ユーザーに代わって画像の読み込みを処理するだけでなく、読み込んだデータに高度な画像処理アルゴリズムを適用できます。 C、Python、C#をサポートしているため、選択した言語に一致するバージョンを簡単に見つけることができます。

    OpenCVをプロジェクトに追加したら、ポイント番号1を解決します。PythonおよびOpenCVを使用した画像内のバーコードの検出から開始するための適切なアルゴリズムについて説明します。 Pythonの使用に気を取られないでください。同じOpenCV関数がCでも利用できます。アイデアはアルゴリズムを理解することです。

    現在、セグメンテーションアルゴリズムが機能していると仮定すると、最後のステップはバーコード自体をデコードすることです。ここでは、この記事のパート2と3を出発点としてお勧めします。事前に構築されたライブラリもあります(Googleの場合、このようなJavaまたはC#で記述されたUPCデコーダがたくさんあります)。少し掘り下げると、すぐに使えるソリューションを見つけることができます。

    お役に立てれば。

あなたの答え