我正在使用OpenCV开发一个应用程序,目前,如果照相机识别出文档中的某些文本区域,则会将其转换为字符串,并且还会从照相机框架中为每个文本区域提取裁剪的图像并将其存储到临时区域中目录。
我知道这些图像的文件路径,我尝试将它们提取到我的camera_activity中的单独的URI字符串中,然后将它们与Intent一起传递给另一个活动,在该活动中应将它们从字符串重新转换为URI,然后作为图像显示在ImageView中。到目前为止,这是我的代码:
camera_activity (使用OpenCV JavaCamera View):
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
OcrResponse resp = ocr.ExtractUserIdData(mRgba, false);
if (resp.ok) {
ArrayList<String> strings = new ArrayList<>();
ArrayList<String> uriStrings = new ArrayList<>();
ArrayList<Uri> uriArray = new ArrayList<>();
Uri uri;
String uriStr;
Intent intent = new Intent(this, activity_output.class);
for (Response_data data : resp.data) {
System.out.println(data.header + ": " + data.details.trim());
strings.add(data.header + ": " + data.details);
uri = Uri.fromFile(new File("dir/" + data.header.replace(' ', '_') + ".png"));
uriStr = uri.toString();
uriStrings.add(uriStr);
}
intent.putStringArrayListExtra("string1", strings);
intent.putStringArrayListExtra("uri_img", uriStrings);
startActivity(intent);
[...]
}
}
稍微解释一下此代码。 OCR从文档中识别出某些文本区域,并将其提取为字符串(格式为“标题:描述”)。 for 语句就是这样做的,将它们添加到名为 strings 的字符串数组中,然后将该数组通过Intent发送到名为 output_activity 的新活动中。 .putStringArrayListExtra。到目前为止,一切都很好。
这是 output_activity 的代码:
public class activity_output extends AppCompatActivity {
TextView text;
ImageView iv;
ArrayList<String> arraylist = new ArrayList<>();
ArrayList<String> arraylistUri = new ArrayList<>();
ArrayList<Uri> uri = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_output);
text = findViewById(R.id.output_text1);
iv = findViewById(R.id.img_out);
arraylist = getIntent().getStringArrayListExtra("string1");
arraylistUri = getIntent().getStringArrayListExtra("uri_img");
//uri = (ArrayList<Uri>) getIntent().getSerializableExtra("img");
StringBuilder builder = new StringBuilder();
StringBuilder builderU = new StringBuilder();
//StringBuilder uriBuilder = new StringBuilder();
for (String s : arraylist) {
builder.append(s).append("\n\n");
}
for (String d : arraylistUri) {
builderU.append(d);
}
text.setText(builder.toString());
//iv.setImageURI(Uri.parse(uriBuilder.toString()));
在这里,我接收到字符串数组并将其转换为TextView。一切正常,所有正确的数据都写入该活动中。毫无疑问,到目前为止,我的代码仍然有效。这是屏幕截图:A little more work on the layout, but functionally it's good
现在,回到 camera_activity ,您可以看到在for语句中,我试图从每个裁剪的图像路径(在'uri'变量内)获取一个URI,然后然后将其转换为名为“ uriStr”的字符串。然后,将每个字符串添加到另一个名为“ UriStrings”的数组列表中,并将其发送到 output_activity 。
最后一个问题是:我究竟如何在 output_activity 中使用包含URI的字符串,以便可以在ImageView中显示这些裁剪的图像?我使用的方法不起作用(毫不奇怪),我需要一个快速的解决方案。
感谢您和愿您的道路将您引向温暖的沙滩!
答案 0 :(得分:0)
我实际上找到了解决URI的方法。这是我发现有人感兴趣的解决方案:
我不再从 camera_activity 发送任何内容,仅使用了 output_activity 。
File mFile = new
File("/data/user/0/com.blissk.myapplication/cacheExtractedSerialNumber.png");
Bitmap mBitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
Bitmap MBitmap = Bitmap.createScaledBitmap(mBitmap,(int)(mBitmap.getWidth()*4),(int)(mBitmap.getHeight()*4),true);
ImageView iv = findViewById(R.id.img_out);
iv.setImageBitmap(MBitmap);
我目前是Java虚拟用户,由于该应用程序应该在退出cameraview后销毁所有扫描的文档(出于隐私原因),因此我认为切换到 output_activity后,缓存图像的路径将不起作用,并认为它们需要通过Intent发送到那里。他们确实工作了,并且 output_activity 完成后,程序成功销毁了所有数据。
基本上,我上面的代码适用于所有使用缓存图像,将其转换为位图,调整大小(在我的情况下,我需要将其放大4倍)并显示它们的应用程序