0

我的目标是在 python 中使用 OpenCV 的结构化边缘检测来查找图像中的边缘,并通过 chaquopy 在 android studio 中使用它。所以在 MainActivity 中,点击按钮时,位图会被传递给 python 文件中的 main 函数进行图像处理,它将返回处理后的图像,并将其设置为 imageView。但由于某种原因,“model.yml”无法打开。代码和错误如下:

python文件是这样的:

import cv2
from PIL import Image
import base64
import io

def main(data):
    decoded_string=base64.b64decode(data)
    np_data=np.fromstring(decoded_string,np.uint8)

    image = cv2.imdecode(np_data,cv2.IMREAD_UNCHANGED)
    g_blurred = cv2.GaussianBlur(image,(5, 5),0)
    blurred_float = g_blurred.astype(np.float32)/255.0
    edgeDetector = cv2.ximgproc.createStructuredEdgeDetection("model.yml") // ERROR IS DUE TO THIS LINE
    edges = edgeDetector.detectEdges(blurred_float) * 255.0
    
    pil_im=Image.fromarray(edges)
    buff = io.BytesIO()
    pil_im.save(buff,format="PNG")
    img_str=base64.b64decode(buff.getvalue())
    return ""+str(img_str,'utf-8')

MainActivity 中的代码:

public class MainActivity extends AppCompatActivity {
Button btn;
ImageView imageView;
Bitmap bitmap;
String imageString=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (! Python.isStarted()) {
            Python.start(new AndroidPlatform(this));
        }
        btn=findViewById(R.id.btn);
        imageView=findViewById(R.id.imageView);
        bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.sample);

        Python python=Python.getInstance();
        final PyObject pyObject=python.getModule("remove_background");

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageString=getString(bitmap);
                PyObject pyObject1=pyObject.callAttr("main",imageString);
                imageString=pyObject1.toString();
                byte image_bytes[]=android.util.Base64.decode(imageString,Base64.DEFAULT);
                bitmap=BitmapFactory.decodeByteArray(image_bytes,0,image_bytes.length);
                imageView.setImageBitmap(bitmap);
            }
        });
    }
    private String getString(Bitmap bitmap)
    {
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG,100,baos);
        byte[] byteImage=baos.toByteArray();
        String encoded_image=android.util.Base64.encodeToString(byteImage, Base64.DEFAULT);
        return encoded_image;
    }
}

我得到的错误:

 com.chaquo.python.PyException: error: OpenCV(4.1.2) /home/smith/git/chaquo/python/server/pypi/packages/opencv-contrib-python/build/4.1.2.30/cp38-cp38-android_16_x86/src/opencv_contrib/modules/ximgproc/src/structured_edge_detection.cpp:432: error: (-215:Assertion failed) modelFile.isOpened() in function 'StructuredEdgeDetectionImpl'

我认为收到此错误是因为它无法打开 model.yml 文件。我已将文件放在与我的 python 脚本相同的目录中,即app/src/main/python. 我对此不确定,我觉得因为“model.yml”文件没有放在正确的文件夹中,这就是我收到此错误的原因。任何帮助表示赞赏。提前致谢!

4

0 回答 0