| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1196 人关注过本帖, 2 人收藏
标题:定位图片中字符的位置,抠出并保存---车牌识别的阶段性成果
取消只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:749
专家分:1114
注 册:2021-10-13
结帖率:96.49%
收藏(2)
已结贴  问题点数:20 回复次数:4 
定位图片中字符的位置,抠出并保存---车牌识别的阶段性成果
奉上源码,供测试用,看看有效性怎么样,有没有未知的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: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:749
专家分:1114
注 册: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
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:749
专家分:1114
注 册:2021-10-13
收藏
得分:0 
好像有点问题,c_cutted.bmp缩略图没有显示,但是大图可以显示。
图片附件: 游客没有浏览图片的权限,请 登录注册
2023-04-22 20:08
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:749
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 8楼 kangss
是二极化后的黑白图片,彩色可不行。

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

2023-04-23 17:28
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:749
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 10楼 东海ECS
是的,我的思路是,

1,确定车牌的位置;2,分割车牌的每个字符;3,将分割的字符保存;4,和标准的字符做对比(字体影响估计不大),and和or运算,and运算黑点占比变化不大以及or运算黑点占比接近0就是标准字符(我在考虑是用api函数bitblt或stretchblt,还是像这个一样,对图像数据做and和or运算,不知道哪个更好?);

我想写的这个车牌识别是在理想状态下的车牌识别,您说的情况是比较特殊的情况,我想先解决有无的问题,然后再解决优劣的问题。

以后再慢慢迭代。。。
2023-04-23 20:48
快速回复:定位图片中字符的位置,抠出并保存---车牌识别的阶段性成果
数据加载中...
 
   



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

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