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是否正确,另外如何将图片文件赋值给它??
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是否正确,另外如何将图片文件赋值给它??
解决方案 »
- 鼠标箭头在图片上,图片切换为另外一副,当不在上面,又切换回原来的?自己老做不好,请教了
- 有淄博的朋友吗?会DELPHI的,请位老师教教我,付费的。
- C++和Delphi转换问题
- avi文件圧縮的問題
- 在对ADOQUERY进记录插入时,如何才能让ADOQUERY按操作员插入的次序显示?急....
- 急需支持Delphi 7.0的数据导出控件(Excel 、Html 、PDF、TXT)
- 小问题,大家看看
- 郁闷,散分!
- QREPORT中要实现分组以及合计的报表如何做,SQL语句怎么写?(要分就加分)
- 有些控件的包在编译安装时,出现Cannot access package informaion for package '',如何解决?
- 那位大哥知道,TDBgridEh打印预览的时候为什么不显示Footer内容哪 ?
- 脚本错误
{是不是这样}
var
Stream: TMemoryStream;
P: PByte;
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile('xxx.bmp');
P := Stream.Memory;
//...
end;
var
Stream: TMemoryStream;
begin
...
Getmem(p,Stream.size);
stm.read(p^,Stream.szie);
end;以上两种通过facedetect(p,..)都错误啊,是不是BYTE* buf 变成 pbyte 不正确???
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 内存流的数据指针,不知道任何弄了。???
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;不知道对不对,请大家指正。
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;
这个调用前应该给facerect,eyesrect分配内存吧,如果没有猜错lpRECT应该是个指针,如果用它返回值,必需先分配内存了,不然肯定会有地址错误facedetect(filename:pchar;face:TRect;eys:TRect),这样调用不会改变face,eys的值
不过可以考虑把facedetect(filename:pchar;face:PRect;eys:PRect),PRect同样是指针也要先分配内存
可能用New 来先初始化
仅仅确定位图为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;