Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从图像中提取较小的图像_C_Image_Opencv_Captcha - Fatal编程技术网

C 从图像中提取较小的图像

C 从图像中提取较小的图像,c,image,opencv,captcha,C,Image,Opencv,Captcha,我开始学习openCV,对此我有疑问 我的目标是识别验证码。 首先,我必须对图像进行预处理 有一个验证码的例子 所以问题是如何从图像中裁剪符号并将其放入2D数组(位图) 自动分区检测 您需要做的第一件事是创建背景色的过滤器数组。这将是包含背景中出现的颜色的数组。为此,您可以选择偏移20x20区域,也可以将其保留为用户选项,具体取决于您的项目立场 typedef unsigned char Pixel [3]; typedef *Pixel PixelArray; // Function t

我开始学习openCV,对此我有疑问

我的目标是识别验证码。
首先,我必须对图像进行预处理

有一个验证码的例子


所以问题是如何从图像中裁剪符号并将其放入2D数组(位图)

自动分区检测


您需要做的第一件事是创建背景色的过滤器数组。这将是包含背景中出现的颜色的数组。为此,您可以选择偏移20x20区域,也可以将其保留为用户选项,具体取决于您的项目立场

typedef unsigned char Pixel [3];
typedef *Pixel PixelArray;

// Function to return offset byte of x/y coordinate
int bmp_get_offset (int width, int x, int y)
{
    int w = width;
    const int channels = 3;
    const int bpp = 8;
    const int single = (channels * bmpp) / 8;
    const int offset = 54;
    int rowsize = w * single;
    int pixAddress;

    if(rowsize % 4 != 0) rowsize += 4 - (rowsize % 4);
    pixAddress = offset + yp * rowsize + xp * single;

    return pixAddress;
}

// Function to return specific area (pseudo-code)
PixelArray bmp_get_area (FILE * bmp, int x, int y, int w, int h)
{
    PixelArray buffer = buffer_new(bmp); // sets image into a memory-allocated buffer
    PixelArray area [h * w];
    const int src_width  = *((int*)&buffer[(0x12)]);

    for(int iWidth = 0; iWidth < w; iWidth++)
        for(int iHeight = 0; iHeight < h; iHeight++)
            area[iHeight * src_width + iWidth] = buffer[bmp_get_offset(src_width, x + iWidth, y + iHeight)];

    return area;
}
typedef无符号字符像素[3];
typedef*像素像素阵列;
//返回x/y坐标的偏移字节的函数
int bmp_get_偏移量(int宽度、int x、int y)
{
int w=宽度;
const int通道=3;
常数int bpp=8;
const int single=(通道*bmpp)/8;
常数int offset=54;
int rowsize=w*单个;
int-pixAddress;
如果(rowsize%4!=0)rowsize+=4-(rowsize%4);
pixAddress=offset+yp*行大小+xp*单个;
返回pixAddress;
}
//返回特定区域的函数(伪代码)
像素阵列bmp_get_区域(文件*bmp,int x,int y,int w,int h)
{
PixelArray buffer=buffer_new(bmp);//将图像设置为内存分配的缓冲区
像素阵列面积[h*w];
常量int src_width=*((int*)和缓冲区[(0x12)];
for(int-iWidth=0;iWidth
它没有那么多伪代码


现在有了过滤器,您可以限制外部像素。 现在您需要的是垂直光栅扫描。或者只是垂直扫描。 在整个验证码图像上。 如果垂直线的每个像素与已获得的
区域的某些颜色相匹配,则将额外检查该像素。
当检查像素是否接近或匹配
区域
颜色时,如果行的所有像素(具有图像高度的大小)返回正值,则aray索引器将递增,以便我们知道最后一个字符的结束位置。


编辑1 在3秒钟内,我调整了图像的颜色曲线,形成了一个普通的背景:

因此,这分别大大简化了过滤过程。 我所做的颜色曲线魔术实际上只是一个亮度/对比度调整控件,这可能是您可以实现的最简单的颜色处理(反转后)


我可能会定期编辑以进一步澄清。这肯定会给你一个很好的练习。真正的实践

文件:

  • (足够多的信息让您开始使用位图。最重要的是位图结构,它是BMPINFOHEADER和DIBHEADER的组合)
  • (替代方案将为您解决所有问题。但是,如果您使用最简单的解决方案解决问题,则不会使您成为更好的程序员)

这很容易通过原始处理完成,而且不涉及库。你允许我发布一个独立于库的解决方案来解决这个问题吗?@Malina好的,开始。这将是很好的+1提供参考“Tesseract OCR”的文本识别库/你的/APD很好,也很棘手。是的,我没有提供太多细节。。但如果需要我会的。