VC函数原型为: 
int facedetect(BYTE* buf,RECT& facerect,RECT& eyesrect);  我将其变成delphi facedetect(buf:Pbyte,facerect:lpRECT;eyesrect:lpRECT):integer; 
其中:facerect:lpRECT;eyesrect:lpRECT绝对正确, 
问题出在BYTE* buf 变成 pbyte  , 对方告诉 buf 为 指向 bmp 内存流的数据指针, 不知道pbyte是否正确,另外如何将图片文件赋值给它??

解决方案 »

  1.   


    {是不是这样}
    var
      Stream: TMemoryStream;
      P: PByte;
    begin
      Stream := TMemoryStream.Create;
      Stream.LoadFromFile('xxx.bmp');
      P := Stream.Memory;
      //...
    end;
      

  2.   

    我另外写法:
    var
     Stream: TMemoryStream;
    begin
         ...
         Getmem(p,Stream.size);
         stm.read(p^,Stream.szie);
    end;以上两种通过facedetect(p,..)都错误啊,是不是BYTE* buf 变成 pbyte  不正确??? 
      

  3.   

    我觉得你的处理方式有问题你的facedetect应该在vc里面调用的,就像我已开始说的你需要使用vc来封装成dll,所有的调用都在里面操作,dll的接口最好是传入文件名和facedetect区域,在dll里面使用cvLoadImage来处理这个文件名的文件。
      

  4.   


    hongqi162 果然高手。
    对方通过vc封装了2个函数其中:
     1、一个就是传入文件名,其中facedetect返回TRect值,facedetect(filename:pchar;face:TRect;eys:TRect);delphi调用这个没有任何问题,可以返回正确的face,eys;
     2、另外一个就是facedetect(buf:pbyte;face:TRect;eys:TRect);delphi无法返回正确值。
      其中buf 类型在vc中为 byte* buf , 对方告诉 buf 为 指向 bmp 内存流的数据指针,不知道任何弄了。???
      
      

  5.   

    图片固定尺寸为320*240,并且为*.bmp格式文件,我在delphi处理为:
    VAR
       face,eys :RECTNEW;
       FileName : String;
       buf :pbyte;
       Stm: TMemoryStream ;
       BitMap :TBitMap;
       REST  : INTEGER;
    begin
       BitMap :=TBitMap.Create;
       Stm:= TMemoryStream.Create;
       try
          BitMap.LoadFromFile('e:\6.bmp');
          BitMap.SaveToStream(Stm);
          Stm.Position:=0;      GetMem(Buf,Stm.size);
          Stm.Read(Buf^,Stm.size);      REST :=facedetect(Buf,@face,@eys);
          if  REST=0 THEN
              Memo1.Lines.Add(' 脸 ---'+' 左 ' + inttostr(face.Left)+' 顶 ' + inttostr(face.Top)+
                                ' 右 ' + inttostr(face.Right)+' 底 ' + inttostr(face.Bottom) );
       finally
          Stm.free;
          BitMap.Free;
       end;  
    end;不知道对不对,请大家指正。
      

  6.   

    将9楼代码改了一下,另外重新定义了Dll中函数说明。楼主需要搞清楚下面代码中我提出的问题,才能使运行结果正确。function facedetect(buf: Pointer; var facerect, eyesrect: TRect): Integer; stdcall;VAR 
      face,eys : TRect;  
      BitMap :TBitMap; 
      REST  : INTEGER; 
    begin 
      BitMap :=TBitMap.Create;  
      try 
          BitMap.LoadFromFile('e:\6.bmp');
          // 不清楚facedetect函数要求多少位的图像格式,这里假定32位,如不正确,换成pf24bit试试 
          BitMap.PixelFormat := pf32bit;
          // 这里有疑问,face和eys未初始化(给定范围),facedetect怎么知道具体部位?
          REST :=facedetect(BitMap.ScanLine[BiMap.Height - 1], face, eys); 
          if  REST=0 THEN 
              Memo1.Lines.Add(' 脸 ---'+' 左 ' + inttostr(face.Left)+' 顶 ' + inttostr(face.Top)+ 
                                ' 右 ' + inttostr(face.Right)+' 底 ' + inttostr(face.Bottom) ); 
      finally 
          BitMap.Free; 
      end;  
    end; 
      

  7.   

    补充疑问:facedetect函数难道是专门为320*240图片写的?不然,不给定图像长宽,它怎么操作?
      

  8.   

    facedetect(buf:Pbyte,facerect:lpRECT;eyesrect:lpRECT):integer;
    这个调用前应该给facerect,eyesrect分配内存吧,如果没有猜错lpRECT应该是个指针,如果用它返回值,必需先分配内存了,不然肯定会有地址错误facedetect(filename:pchar;face:TRect;eys:TRect),这样调用不会改变face,eys的值
    不过可以考虑把facedetect(filename:pchar;face:PRect;eys:PRect),PRect同样是指针也要先分配内存
    可能用New 来先初始化
      

  9.   

    顶一个,这就是delphi和C++一些类型使用上的难点,通用度不高,往往一个简单的东西都需要费时间去研究,导致很多人错认为delphi不如VC用起来方便。
      

  10.   


    仅仅确定位图为320*240还不够, 还要确定它的颜色深度, 这个是直接影响位图数据的格式的。int facedetect(BYTE* buf,RECT& facerect,RECT& eyesrect);  
    申明成:
    facedetect(buf: Pbyte; var facerect, eyesrect: TRECT): Integer; 
    VAR 
      face,eys: TRECT;
      Stm     : TMemoryStream;
      BitMap  : TBitMap;
      REST    : Integer;
    begin 
      BitMap := TBitMap.Create; 
      try 
        BitMap.LoadFromFile('e:\6.bmp'); 
        BitMap..PixelFormat := pf32bit;    //pf32bit这个值要测试一下, 不一定合适
        Stm := TMemoryStream.Create; 
        try
          BitMap.SaveToStream(Stm); 
          Stm.Position := 0; 
          REST := facedetect(PByte(Stm.Memory), face, eys); 
          if  REST = 0 then
            Memo1.Lines.Add(' 脸 ---'+' 左 ' + inttostr(face.Left)+' 顶 ' + inttostr(face.Top)+ 
                            ' 右 ' + inttostr(face.Right)+' 底 ' + inttostr(face.Bottom) ); 
        finally
          Stm.free; 
        end;
      finally 
        BitMap.Free; 
      end;  
    end;