标题:定位图片中字符的位置,抠出并保存---车牌识别的阶段性成果
只看楼主
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
结帖率:97.44%
已结贴  问题点数:20 回复次数:10 
定位图片中字符的位置,抠出并保存---车牌识别的阶段性成果
奉上源码,供测试用,看看有效性怎么样,有没有未知的bug等等。。。

程序代码:
PARAMETERS cfilename
IF PARAMETERS()=0
    cfilename=GETFILE("bmp")
ENDIF
    
IF UPPER(RIGHT(cfilename,4))#UPPER(".bmp")
    RETURN .f.
ENDIF
SET CLASSLIB TO myclass
bmpf=CREATEOBJECT("bmpfile")
bmpf.load(cfilename)
*!*    cstr=FILETOSTR(cfilename) &&图像文件流
colordata=bmpf.bitmapdata&&提取图像像素数据
****将图像数据转换为一个长为image4.width,宽为image4.height的由0和1组成的矩阵********
colordata=STRTRAN(colordata,REPLICATE(CHR(0),3)+CHR(255),"1") &&将黑色像素转换为1
colordata=STRTRAN(colordata,REPLICATE(CHR(255),3)+CHR(255),"0") &&将白色像素转换为0
**********************************************************************************
LOCAL nposition,nleft,ntop,nright,nbottom,nx,ny,colordata1,x,y
nx=bmpf.bmiheader.biwidth
ny=bmpf.bmiheader.biheight
nposition=AT("1",colordata,1) &&定位第一个黑色像素的位置
nbottom=ny-INT(nposition/nx) &&确定第一个黑色像素所在行
nposition=rAT("1",colordata,1) &&定位倒数第一个黑色像素的位置
ntop=ny-CEILING(nposition/nx) &&确定最后一个黑色像素所在行
nleft=nx
nright=0
FOR i=1 TO ny
    datainline=SUBSTR(colordata,(i-1)*nx+1,nx)
    nposition=AT("1",datainline,1)
    IF nposition#0
        nleft=min(nleft,nposition) &&定位最左侧黑色像素的位置
    ENDIF
    nposition=RAT("1",datainline,1)
    IF nposition#0
        nright=max(nright,nposition) &&定位最右侧黑色像素的位置
    ENDIF
ENDFOR
*******************************写位图数据***********************************
bmpf.bmiheader.biwidth=nright-nleft+1
bmpf.bmiheader.biheight=nbottom-ntop+1
colordata1=""
FOR y=ntop TO nbottom
    colordata1=colordata1+SUBSTR(colordata,y*nx+nleft,nright-nleft+1)
ENDFOR
colordata1=STRTRAN(colordata1,"1",REPLICATE(CHR(0),3)+CHR(255)) 
colordata1=STRTRAN(colordata1,"0",REPLICATE(CHR(255),3)+CHR(255)) 
bmpf.bitmapdata=colordata1    
bmpf.bmfheader.bfsize=LEN(bmpf.bmfheader.struct)+;
    LEN(bmpf.bmiheader.struct)+;
    LEN(bmpf.colortable)+;
    LEN(bmpf.bitmapdata)
outputfile=JUSTFNAME(cfilename)
outputfile=STREXTRACT(cfilename,"",".")+"_cutted"+".bmp"
bmpf.save(outputfile)
CLEAR ALL
SET CLASSLIB TO 


搜索更多相关主题的帖子: 像素 IF 定位 位置 黑色 
2023-04-22 19:49
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
忘记类定义文件。。。

程序代码:
**************************************************
*-- Class:        bmpfile (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass:  struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- BaseClass:    custom
*-- Time Stamp:   04/15/23 09:19:03 PM
*
DEFINE CLASS bmpfile AS struct


    *-- 颜色表
    colortable = ("")
    *-- 位图数据
    bitmapdata = ("")
    *-- 用来保存bmp文件名。
    filename = ""
    Name = "bmpfile"


    *-- 保存bmp文件。
    PROCEDURE save
        PARAMETERS cfilename
        IF PARAMETERS()=0
            cfilename=PUTFILE("","unnamed1","bmp")
            IF EMPTY(cfilename)
                RETURN .f.
            ENDIF
        ENDIF
        cfilename=IIF(UPPER(RIGHT(cfilename,4))==UPPER(".bmp"),cfilename,cfilename+".bmp")
        this.filename=cfilename
        cstr=this.bmfheader.getstruct()+this.bmiheader.getstruct()+this.colortable+this.bitmapdata
        STRTOFILE(cstr,cfilename,0)
        RELEASE cfilename,cstr
        RETURN .t.
    ENDPROC


    *-- 读取bmp文件。
    PROCEDURE load
        PARAMETERS cfilename
        IF PARAMETERS()=0
            cfilename=GETFILE("bmp")
            IF EMPTY(cfilename)
                RETURN .f.
            ENDIF
        ENDIF
        this.filename=cfilename
        cstr=FILETOSTR(cfilename)
        this.bmfheader.set(SUBSTR(cstr,1,14))
        this.bmiheader.set(SUBSTR(cstr,15,40))
        IF this.bmfheader.bfoffbits#54
            this.colortable=SUBSTR(cstr,55,this.bmfheader.bfoffbits-54)
        ENDIF
        *this.bitmapdata=SUBSTR(cstr,this.bmfheader.bfoffbits+1,LEN(cstr)-this.bmfheader.bfoffbits)
        this.bitmapdata=right(cstr,LEN(cstr)-this.bmfheader.bfoffbits)
        RELEASE cfilename,cstr
        RETURN .t.
    ENDPROC


    *-- 新建一个bmp文件。
    PROCEDURE new
        PARAMETERS nwidth,nheight
        this.bmfheader.bftype="BM"
        *!*    this.bmfheader.bfoffbits=54
        this.bmiheader.biwidth=nwidth
        this.bmiheader.biheight=nheight
        *!*    this.bmiheader.bibitcount=32
        this.bmiheader.bisizeimage=nwidth*nheight
        this.bmfheader.bfsize=LEN(this.colortable)+54+nwidth*nheight*4
        this.bitmapdata=REPLICATE(chr(255),nwidth*nheight*4)
        this.save
    ENDPROC


    PROCEDURE Init
        this.AddObject("bmfheader","bmfheader")
        this.AddObject("bmiheader","bmiheader")
    ENDPROC


ENDDEFINE
*
*-- EndDefine: bmpfile
**************************************************
**************************************************
*-- Class:        bmfheader (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass:  struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- BaseClass:    custom
*-- Time Stamp:   04/15/23 08:50:04 PM
*
DEFINE CLASS bmfheader AS struct


    Height = 25
    Width = 155
    *-- BMP文件类型,为字符BM,2个字节。
    bftype = "BM"
    *-- 文件大小,4个字节。
    bfsize = 0
    *-- 保留字节,2个字节。
    bfreserved1 = 0
    *-- 保留字节2,2个字节。
    bfreserved2 = 0
    *-- bitmap文件的图像数据起始位置偏移量,4个字节。
    bfoffbits = 54
    struct = (repli(chr(0),14))
    Name = "bmfheader"


    PROCEDURE getstruct
        this.struct=this.bftype+BINTOC(this.bfsize,"4rs");
                    +BINTOC(this.bfreserved1,"2rs");
                    +BINTOC(this.bfreserved2,"2rs");
                    +BINTOC(this.bfoffbits,"4rs")
        RETURN this.struct
    ENDPROC


    PROCEDURE set
        PARAMETERS cstruct
        IF LEN(cstruct)#14
            RETURN .f.
        ENDIF
        this.bftype=SUBSTR(cstruct,1,2)
        this.bfsize=;
            ASC(SUBSTR(cstruct,3,1))+;
            ASC(SUBSTR(cstruct,4,1))*0x100+;
            ASC(SUBSTR(cstruct,5,1))*0x10000+;
            ASC(SUBSTR(cstruct,6,1))*0x1000000
        *!*    this.bfreserved1=0 &&不需要设置,默认为零
        *!*    this.bfreserved2=0 &&不需要设置,默认为零
        this.bfoffbits=;
            ASC(SUBSTR(cstruct,11,1))+;
            ASC(SUBSTR(cstruct,12,1))*0x100+;
            ASC(SUBSTR(cstruct,13,1))*0x10000+;
            ASC(SUBSTR(cstruct,14,1))*0x1000000
        RETURN .t.

    ENDPROC


ENDDEFINE
*
*-- EndDefine: bmfheader
**************************************************
**************************************************
*-- Class:        bmiheader (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass:  struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- BaseClass:    custom
*-- Time Stamp:   04/02/23 05:50:12 PM
*
DEFINE CLASS bmiheader AS struct


    Height = 27
    Width = 178
    *-- bitmapinfo的size,4个字节。
    bisize = 40
    *-- 位图宽,4个字节。
    biwidth = 0
    *-- 位图高,4个字节。
    biheight = 0
    *-- 为目标设备说明位面数,其值将总是被设为1,2个字节。
    biplanes = 1
    *-- 说明比特数/像素,其值为1、4、8、16、24、或32,2个字节。
    bibitcount = 32
    *-- 说明图像数据压缩的类型,4个字节。
    bicompression = 0
    *-- 说明图像的大小,以字节为单位。当用BI_RGB格式时,可设置为0
    bisizeimage = 0
    *-- 说明水平分辨率,用像素/米表示
    bixpelspermeter = 0
    *-- 说明垂直分辨率,用像素/米表示
    biypelspermeter = 0
    *-- 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)
    biclrused = 0
    *-- 说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要,4个字节。
    biclrimportant = 0
    struct = (repli(chr(0),40))
    Name = "bmiheader"


    PROCEDURE set
        PARAMETERS cstruct
        IF LEN(cstruct)#40
            RETURN .f.
        ENDIF
        this.bisize=ASC(SUBSTR(cstruct,1,1)) &&通常这个值一个字节就够了
        this.biwidth=;
            ASC(SUBSTR(cstruct,5,1))+;
            ASC(SUBSTR(cstruct,6,1))*0x100+;
            ASC(SUBSTR(cstruct,7,1))*0x10000+;
            ASC(SUBSTR(cstruct,8,1))*0x1000000
        this.biheight=;
            ASC(SUBSTR(cstruct,9,1))+;
            ASC(SUBSTR(cstruct,10,1))*0x100+;
            ASC(SUBSTR(cstruct,11,1))*0x10000+;
            ASC(SUBSTR(cstruct,12,1))*0x1000000
        *!*    this.biplanes=1 && 不需要设置,默认为1
        this.bibitcount=ASC(SUBSTR(cstruct,15,1))&&这个值一个字节就够了
        this.bicompression=;
            ASC(SUBSTR(cstruct,17,1))+;
            ASC(SUBSTR(cstruct,18,1))*0x100+;
            ASC(SUBSTR(cstruct,19,1))*0x10000+;
            ASC(SUBSTR(cstruct,20,1))*0x1000000
        this.bisizeimage=;
            ASC(SUBSTR(cstruct,21,1))+;
            ASC(SUBSTR(cstruct,22,1))*0x100+;
            ASC(SUBSTR(cstruct,23,1))*0x10000+;
            ASC(SUBSTR(cstruct,24,1))*0x1000000
        this.bixpelspermeter=;
            ASC(SUBSTR(cstruct,25,1))+;
            ASC(SUBSTR(cstruct,26,1))*0x100+;
            ASC(SUBSTR(cstruct,27,1))*0x10000+;
            ASC(SUBSTR(cstruct,28,1))*0x1000000
        this.biypelspermeter=;
            ASC(SUBSTR(cstruct,29,1))+;
            ASC(SUBSTR(cstruct,30,1))*0x100+;
            ASC(SUBSTR(cstruct,31,1))*0x10000+;
            ASC(SUBSTR(cstruct,32,1))*0x1000000
        this.biclrused=;
            ASC(SUBSTR(cstruct,33,1))+;
            ASC(SUBSTR(cstruct,34,1))*0x100+;
            ASC(SUBSTR(cstruct,35,1))*0x10000+;
            ASC(SUBSTR(cstruct,36,1))*0x1000000
        this.biclrimportant=;
            ASC(SUBSTR(cstruct,37,1))+;
            ASC(SUBSTR(cstruct,38,1))*0x100+;
            ASC(SUBSTR(cstruct,39,1))*0x10000+;
            ASC(SUBSTR(cstruct,40,1))*0x1000000
        RETURN .f.
    ENDPROC


    PROCEDURE getstruct
        this.struct=BINTOC(this.bisize,"4rs");
                    +BINTOC(this.biwidth,"4rs");
                    +BINTOC(this.biheight,"4rs");
                    +BINTOC(this.biplanes,"2rs");
                    +BINTOC(this.bibitcount,"2rs");
                    +BINTOC(this.bicompression,"4rs");
                    +BINTOC(this.bisizeimage,"4rs");
                    +BINTOC(this.bixpelspermeter,"4rs");
                    +BINTOC(this.biypelspermeter,"4rs");
                    +BINTOC(this.biclrused,"4rs");
                    +BINTOC(this.biclrimportant,"4rs")
        RETURN this.struct
    ENDPROC


ENDDEFINE
*
*-- EndDefine: bmiheader
**************************************************
**************************************************
*-- Class:        struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass:  custom
*-- BaseClass:    custom
*-- Time Stamp:   04/02/23 04:00:01 PM
*
DEFINE CLASS struct AS custom


    *-- 用以储存或设置结构体数据
    struct = ("")
    Name = "struct"


    *-- 设置结构体
    PROCEDURE set
        RETURN .t.
    ENDPROC


    *-- 获得结构体数据。
    PROCEDURE getstruct
    ENDPROC


ENDDEFINE
*
*-- EndDefine: struct
**************************************************
2023-04-22 19:53
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:4 
感谢分享
2023-04-22 20:02
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
好像有点问题,c_cutted.bmp缩略图没有显示,但是大图可以显示。
2023-04-22 20:08
pvm2000
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:24
帖 子:159
专家分:256
注 册:2022-12-22
得分:4 
2023-04-23 02:35
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:4 
谢谢分享!
2023-04-23 06:07
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:4 
厉害!能用VFP来解决如此复杂的图形识别问题。

活到老,学到老! http://www. E-mail:hu-jj@
2023-04-23 08:31
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:4 
我运行测试,生成的bmp是乱的,不显图像
2023-04-23 16:49
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
回复 8楼 kangss
是二极化后的黑白图片,彩色可不行。

[此贴子已经被作者于2023-4-23 17:45编辑过]

2023-04-23 17:28
东海ECS
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:4 
您的代码是为了通过定位车牌图像中黑色像素的位置并根据它们的位置裁剪图像以提取车牌字符。这是一种车牌识别的方法,但还有许多其他因素需要考虑,例如照明、透视,以及车牌上具体使用的字体等。

会当凌绝顶,一览众山小.
2023-04-23 19:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-512006-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.118312 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved