我需要一些关于如何从bmp文件中获取12位数条码的指导,我完全不知道如何处理这个问题。 我开始把图像读成一个bitmam,我怎么能继续?
示例:下图中的条形码为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;
}
答案 0 :(得分:2)
您需要将计算机视觉技术应用于:
这个问题没有单一的答案,绝对不会是单行。
一种开始的方法是使用像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),所以通过一些挖掘,你可以找到一个不合适的库。盒子解决方案。
希望这有帮助。