初次使用Opencv 2.3.1发现出现的错误情况不少。
1 把原来delphi 7 下的opencv 1.0更换为2.3.1就出现缺少dll文件信息。目录确认没有问题。弄了一个早上重新编译了好几次突然就好了,现在也没有弄明白是怎么回事。
2 好不容易可以用opencv 2.3.1 了,在操作过程中又会出现Invalid Floating point operation错误信息
3 只好在cvThreshold 函数之前使用showmessage()暂停一下突然发现程序不再出现错误信息。我的程序中使用了两次cvThreshold所以要使用showmessage()两次才可以,比较麻烦。
4 我进行了一个测试,如果我用opencv1.0中的cvThreshold就不会出现问题。现在只好 2.3.1和1.0混用。不过这不是个办法,到底他们有什么改变。
function TFrmReceiveTray.GetImageFromCamera(): PIplImage;
var
Img: PIplImage;
begin
Img := cvQueryFrame(capture);
if not (assigned(Img)) then
begin
Img := nil;
Result := Img;
exit;
end;
cvFlip(Img, Img, -1); //绕y轴旋转
result := Img;
end;
procedure TFrmReceiveTray.DisplayImage(Img: PIplImage; Image: TImage);
var
bmp1: TBitmap;
rec1: TRect;
begin
bmp1 := TBitmap.Create;
bmp1.PixelFormat := pf24bit;
IplImage2Bitmap(Img, bmp1);
rec1 := Image.canvas.ClipRect;
Image.canvas.StretchDraw(rec1, bmp1);
bmp1.Free;
end;
下面是图像处理过程
OriginalImage := GetImageFromCamera;
if OriginalImage = nil then
begin
ShowMessage('没有获取到图片,请检查摄像头是否正常工作');
exit;
end;
frame := cvCreateImage(cvSize_(OriginalImage.Width * 1, OriginalImage.Height * 1), 8, 3);
frame := cvCloneImage(OriginalImage);
//cvResize(OriginalImage, frame, CV_INTER_lINEAR);
dstframe := cvCreateImage(cvSize_(frame.Width, frame.Height), IPL_DEPTH_8U, 3);
cvThreshold(frame, dstframe, TBarThresold.Position, 255.0, CV_THRESH_BINARY); //取阀值为50把图像转为二值图像
DisplayImage(dstframe, Image1);
Exit;
这个过程在一个按钮事件中,当我模拟用户按下按键第八次的时候就会出现错误提示信息。
如果我在事件中不使用cvThreshold就没有任何问题。或者在cvThreshold设置断点连续运行的时候也不会出现错误信息。
呵呵 问题终于解决了我再delphi中把cvThreshold申明为procedure了,我看源代码的时候是funciton是有返回值的。