从图像中读取UPC条形码

时间:2018-05-25 08:31:29

标签: c

我需要一些关于如何从bmp文件中获取12位数条码的指导,我完全不知道如何处理这个问题。 我开始把图像读成一个bitmam,我怎么能继续?

示例:下图中的条形码为081034489030。 我怎么得到这些数字?

enter image description here

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 个答案:

答案 0 :(得分:2)

您需要将计算机视觉技术应用于:

  1. 从图像中分割条形码
  2. 解码条形码信息,以便可以在应用程序中进一步使用。
  3. 这个问题没有单一的答案,绝对不会是单行。

    一种开始的方法是使用像OpenCV这样的专用计算机视觉库。它不仅可以代表您处理图像加载,还可以对加载的数据应用高级图像处理算法。它支持C,Python,C#,因此您应该可以轻松找到与您选择的语言相匹配的版本。

    将OpenCV添加到项目后,是时候解决1号点了。从Detecting Barcodes in Images with Python and OpenCV开始描述了一个很好的算法。不要因使用Python而分心,C中也可以使用相同的OpenCV函数,理念是理解算法。

    假设您现在有一个工作分段算法,最后一步是解码条形码本身。在这里,我建议将this article的第2部分和第3部分作为起点。还有预先构建的库(如果你是谷歌,有很多UPC解码器用Java或C#编写,如this one),所以通过一些挖掘,你可以找到一个不合适的库。盒子解决方案。

    希望这有帮助。