我的目标是在 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”文件没有放在正确的文件夹中,这就是我收到此错误的原因。任何帮助表示赞赏。提前致谢!