我想要帮助使用OpenCV for Android(Git:https://github.com/CarlosHe/OpenCV-Android-Firemonkey),轮廓示例.
我不知道如何使用轮廓列表(JLIST)? 我想循环通过所有的等高线,并在Memo1中输出每一个.
下面是代码(返回错误"地址C8E40F40,访问地址47F027B5处的访问冲突"):
var
LSrcMat: JMat;
LDstMat: JMat;
LHierarchyMat: JMat;
LJBitmap: JBitmap;
LThreshold: Double;
LContoursList: JList;
trash, maxval: Double;
i, type_: Integer;
begin
FOpenCVInProgress := True;
try
trash := StrToFloat(edtTrash.Text);
maxval := StrToFloat(edtMaxVal.Text);
type_ := StrToInt(edtType.Text);
LSrcMat := TJMat.JavaClass.init;
LDstMat := TJMat.JavaClass.init;
LHierarchyMat:= TJMat.JavaClass.init;
LContoursList:= JList(TJArrayList.JavaClass.init(0));
LJBitmap := TJBitmap.JavaClass.createBitmap(Trunc(FCamBitmap.Width), Trunc(FCamBitmap.Height), TJBitmap_Config.JavaClass.ARGB_8888);
TJandroid_Utils.JavaClass.bitmapToMat(BitmapToJBitmap(FCamBitmap), LSrcMat);
TJImgproc.JavaClass.cvtColor(LSrcMat, LDstMat, TJImgproc.JavaClass.COLOR_RGB2GRAY); // change picture to gray
LThreshold := TJImgproc.JavaClass.threshold(LDstMat, LDstMat, trash, maxval, type_); // classify pixels into two different groups
TJImgproc.JavaClass.Canny(LDstMat, LDstMat, LThreshold, LThreshold * 2); // Edge detection
TJImgproc.JavaClass.findContours(LDstMat, LContoursList, LHierarchyMat, TJImgproc.JavaClass.RETR_EXTERNAL, TJImgproc.JavaClass.CHAIN_APPROX_SIMPLE ); // find edge
TJImgproc.JavaClass.cvtColor(LDstMat, LDstMat, TJImgproc.JavaClass.COLOR_GRAY2RGB); // change picture to color
TJImgproc.JavaClass.drawContours(LDstMat, LContoursList, -1, TJScalar.JavaClass.init(255,255,0) , 3); // draw edge
TJandroid_Utils.JavaClass.MatToBitmap(LDstMat, LJBitmap);
FCamBitmap := JBitmapToBitmap(LJBitmap);
// returns an error "Access violation at address C8E40F40, access address 47F027B5"
For i := 0 to LContoursList.size - 1 do
begin
Memo1.Lines.Add(JStringToString((LContoursList.get(i).toString)));
end;