Я фиксирую изображение с IP-камеры, и я работаю с кадрами. Моя программа читает, когда есть движение, а затем она делает фотографию и сохраняет ее на компьютере. Сначала он работает отлично, но когда он работает как 2-3 часа, он обычно получает ошибку, и я не нахожу объяснения этому. Потому что, если это ошибка при получении изображения или обработки, это должно произойти с самого начала, не так ли?Ошибка чтения с IP-камеры
Ошибки я получаю следующее:
Исключение в потоке "главный" java.lang.NullPointerException в com.googlecode.javacv.IPCameraFrameGrabber.grab (IPCameraFrameGrabber.java:105) в Llamada .main (Llamada.java:34)
Я искал ошибку nº105, но ничего не нашел.
Программа следующая:
public class Llamada {
public static void main(String[] args) throws Exception {
IPCameraFrameGrabber grabber = new IPCameraFrameGrabber("http://192.168.2.102:80/mjpg/video.mjpg");
//OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
IplImage frame = grabber.grab();
IplImage image = null;
IplImage prevImage = null;
IplImage diff = null;
Date data = new Date();
String output = "";
int i=0, j=0;
CanvasFrame canvasFrame = new CanvasFrame("IP Camera");
canvasFrame.setCanvasSize(frame.width(), frame.height());
CvMemStorage storage = CvMemStorage.create();
while (canvasFrame.isVisible() && (frame = grabber.grab()) != null) {
cvSmooth(frame, frame, CV_GAUSSIAN, 9, 9, 2, 2);
if (image == null) {
image = IplImage.create(frame.width(), frame.height(), IPL_DEPTH_8U, 1);
cvCvtColor(frame, image, CV_RGB2GRAY);
} else {
prevImage = IplImage.create(frame.width(), frame.height(), IPL_DEPTH_8U, 1);
prevImage = image;
image = IplImage.create(frame.width(), frame.height(), IPL_DEPTH_8U, 1);
cvCvtColor(frame, image, CV_RGB2GRAY);
}
if (diff == null) {
diff = IplImage.create(frame.width(), frame.height(), IPL_DEPTH_8U, 1);
}
if (prevImage != null) {
// perform ABS difference
cvAbsDiff(image, prevImage, diff);
// do some threshold for wipe away useless details
cvThreshold(diff, diff, 64, 255, CV_THRESH_BINARY);
canvasFrame.showImage(diff);
// recognize contours
CvSeq contour = new CvSeq(null);
cvFindContours(diff, storage, contour, Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
while (contour != null && !contour.isNull()) {
if (contour.elem_size() > 0) {
output = data.toString();
if (data != null)
output = output.substring(0,10);
if(i%300 == 0)
cvSaveImage((j++)+" "+ output +"-capture.jpg", frame);
CvBox2D box = cvMinAreaRect2(contour, storage);
// test intersection
if (box != null) {
CvPoint2D32f center = box.center();
CvSize2D32f size = box.size();
}
i++;
}
contour = contour.h_next();
}
}
}
grabber.stop();
canvasFrame.dispose();
}
}
Спасибо за все!
Итак, если я инициализирую граббер за пределами основного, как статический, может ли он решить проблему? Я не уверен, почему инициализация влияет на вызов метода grab. –
Трудно сказать, допустим, что класс не ожидал, что вы его инициализируете так, как у вас есть; это не ясно документировано, что может и не может быть передано для его инициализации. Поэтому я просматриваю: https://code.google.com/p/javacv/source/browse/src/main/java/com/googlecode/javacv/IPCameraFrameGrabber.java?r=0e399872bfeb3824e975b3c575ad3a0a41027dee, а его строка 105 даже не что-то, что вызовет исключение. Можете ли вы начать с обновления вашей зависимости от этой библиотеки? – dlamblin
В методе начала есть код, который комментируется как «хрупкий», а в методе grabBufferedImage есть захватывающие вызовы, которые могут его выбросить. Я пытаюсь помочь, но ваша проблема, скорее всего, связана с ожиданиями этой библиотеки, которую вы используете, и несоответствие с тем, что делает ваша IP-камера на самом деле, которая не была проверена оригинальным автором (ами) , – dlamblin