我正在使用omr
在android
中制作opencv
扫描程序,并且我已经获得了处理示例图像的图像处理代码。现在,当我将样本图像替换为来自相机的实际图像,同时将bitmap
转换为Mat
时,它会抛出nullpointer
,就好像我显示该位图图像一样,它会正确地显示它。
请帮我解决这个nullpointer异常。
我的图像存储在存储中,我正在通过意图中的附加功能将uri传递给当前活动。
我的图像处理活动和显示图像是
public class ImageDisplayActivity extends AppCompatActivity {
private static final String TAG = "ImageDisplayActivity";
private static ImageView imageView;
private String filename;
private Uri fileUri;
private Bitmap image;
private Mat localMat;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
localMat = new Mat();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
public ImageDisplayActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_display);
filename = getIntent().getStringExtra("filename");
fileUri = Uri.parse(filename);
//filename="/storage/sdcard/omr.jpg";
//filename= Environment.getExternalStorageDirectory().getPath()+"download/BJq8M.jpg";
imageView = (ImageView)findViewById(R.id.displayImage);
BitmapFactory.Options options = new BitmapFactory.Options();
// downsizing image as it throws OutOfMemory Exception for larger
// images
image=BitmapFactory.decodeFile(fileUri.getPath());
Utils.bitmapToMat(image, localMat);
//detectEdges(image);
showAllCircles(image);
//this line properly displays image preview
//this.imageView.setImageBitmap(image);
}
Showcircle是
public void showAllCircles(Bitmap paramView)
{
Mat localMat1 = new Mat();
//throws nullpointer exception here for localmat1
Utils.bitmapToMat(paramView, localMat1);
Mat localMat2 = new Mat();
Imgproc.GaussianBlur(localMat1, localMat2, new Size(5.0D, 5.0D), 7.0D, 6.5D);
Object localObject = new Mat();
Imgproc.cvtColor(localMat2, (Mat)localObject, COLOR_RGB2GRAY);
Mat cloneMat= ((Mat) localObject).clone();
//Mat blackwhite= ((Mat) localObject).clone();
localMat2 = localMat1.clone();
bitwise_not(cloneMat,cloneMat);
Imgproc.threshold(cloneMat,localMat2,127,255,Imgproc.THRESH_OTSU);
Mat thresh=localMat2.clone();
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
List<MatOfPoint> questions = new ArrayList<MatOfPoint>();
List<MatOfPoint> sorted = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(localMat2, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Rect rect,rect2;
int groups[] = new int[30];
int i=0,l=0;
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
rect = Imgproc.boundingRect(contours.get(contourIdx));
//float area=rect.width/(float)rect.height;
if(rect.width>=29 && rect.height>=29){
questions.add(contours.get(contourIdx));
//rect3 = Imgproc.boundingRect(questions.get(i));
//Log.i("Before------",rect3.tl()+" ");
for(int ctr=0;ctr<questions.size()-1;ctr++){
MatOfPoint ctr1 = questions.get(i);
rect = Imgproc.boundingRect(questions.get(i));
MatOfPoint ctr2 = questions.get(ctr);
rect2 = Imgproc.boundingRect(questions.get(ctr));
if(rect.tl().x<rect2.tl().x){
questions.set(ctr,ctr1);
questions.set(i,ctr2);
}
}
//rect3 = Imgproc.boundingRect(questions.get(i));
//Log.i("after",rect3.tl()+" ");
i++;
if(i%5==0){
groups[l]=questions.indexOf(contours.get(contourIdx));
l++;
//Log.i("groups---",""+groups[l-1]);
}
}
}
int j=0;i=0;
while(j!=questions.size()){
for(int ctr=0;ctr<questions.size()-1;ctr++){
MatOfPoint ctr1 = questions.get(i);
rect = Imgproc.boundingRect(questions.get(i));
MatOfPoint ctr2 = questions.get(ctr);
rect2 = Imgproc.boundingRect(questions.get(ctr));
if(rect.tl().y<rect2.tl().y){
questions.set(ctr,ctr1);
questions.set(i,ctr2);
}
}
i++;
j++;
}
//Collections.sort(questions, Collections.reverseOrder());
int bubble =0;
for (int contourIdx = 0; contourIdx < questions.size(); contourIdx++) {
Rect rectCrop = boundingRect(questions.get(contourIdx));
Mat imageROI= thresh.submat(rectCrop);
int total = countNonZero(imageROI);
double pixel =total/contourArea(questions.get(contourIdx))*100;
if(pixel>=80){
Log.i("Answer:",bubble+" - "+contourIdx%5);
//sorted.add(questions.get(contourIdx));
Imgproc.drawContours(localMat1, questions, contourIdx, new Scalar(255.0D, 0.0D, 0.0D), 2);
bubble++;
}
}
//Random rnd = new Random();
//i=0;
//int r=0,g=0,b=0;
/*for (int contourIdx = 0; contourIdx <sorted.size(); contourIdx++) {
// r=rnd.nextInt(256);
//g=rnd.nextInt(256);
//b=rnd.nextInt(256);
Imgproc.drawContours(localMat1, sorted, contourIdx, new Scalar(255.0D, 0.0D, 0.0D), 2);
i=i+1;
//Log.i("Local Objects","Local Object Point -
// ------------------"+localMat2);
}*/
// displays final image
Utils.matToBitmap(localMat1, paramView);
this.imageView.setImageBitmap(paramView);
}
Android控制台错误
E / AndroidRuntime:致命异常:主要 处理:com.example.admin.app,PID:7310 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.admin.app/com.example.admin.app.ImageDisplayActivity}:java.lang.IllegalArgumentException:mat == null 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在android.app.ActivityThread.access $ 800(ActivityThread.java:151) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1303) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 引起:java.lang.IllegalArgumentException:mat == null 在org.opencv.android.Utils.bitmapToMat(Utils.java:92) 在org.opencv.android.Utils.bitmapToMat(Utils.java:102) at com.example.admin.bubbleboard.ImageDisplayActivity.onCreate(ImageDisplayActivity.java:94) 在android.app.Activity.performCreate(Activity.java:5990) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在android.app.ActivityThread.access $ 800(ActivityThread.java:151) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1303) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372)
答案 0 :(得分:0)
我把这个问题排序了。这是因为我的opencv
库是在onCreate
方法之后加载的。