2013-02-27 4 views
2

나는 비디오 프레임에서 작업하고 있는데 다른 프레임에서 하나의 프레임을 빼서 차이를 알아 내고 싶지만 진행 방법을 모른다. 비트 맵 프레임을 매트로 변환 한 다음 빼기를 시도했지만 작동하지 않습니다. 나는 매트 함수에 대해 opencv 2.4.3을 사용하고 있습니다. 아무도 그걸하는 법을 말해 줄 수 없어요. 가능한 경우 코드 스 니펫으로 설명하십시오. 당신은 단지 다른에서 하나 개의 프레임을 빼면안드로이드에서 opencv를 사용하여 다른 프레임에서 하나의 프레임을 빼는 방법

내가이

 Bitmap myBitmap1 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image001.jpg"); 
    Bitmap myBitmap2 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image002.jpg"); 

    int width = myBitmap1.getWidth(); 
    int height = myBitmap1.getHeight(); 

    Mat imgToProcess1 = new Mat(height, width, CvType.CV_8UC4); 
    Mat imgToProcess2 = new Mat(height, width, CvType.CV_8UC4); 
    Mat imgToProcess = new Mat(height, width, CvType.CV_8UC4); 

    Utils.bitmapToMat(myBitmap1, imgToProcess1); 
    Utils.bitmapToMat(myBitmap2, imgToProcess1);   
    imgToProcess = imgToProcess1-imgToProcess2; 
+0

[이 문제가] 실행 중입니까 (http://stackoverflow.com/questions/9044909/android-bitmapfactory-decodefile-opencv-does-return-invaild-bitmap)? 'imread'로 직접 파일을 읽을 수 있습니까? – mrh

+2

내가 여기있는 동안, 단지 행렬을 빼는 것이 아니라'absdiff'를 사용하는 것이 좋습니다. – mrh

+0

감사합니다 mrh .. 나는이 문제에 대해 absdiff()와 그 작업을 시도했습니다 ... +1 : – AnShU

답변

3

같은 시도, 당신은 단지 두 번째 프레임은 처음보다 더 높은 값을 가지는 영역을 포함하는 이미지로 끝날거야 틀.

absdiff(imgToProcess1, imgToProcess2, imgToProcess); 

이 당신에게 실제 차이의 매트릭스를 줄 것이다,하지만 당신은 차이의 영역의 마스크를 원한다면, 당신은을 적용 할 수

차이를 얻으려면, 당신은 absdiff를 사용할 필요가 결과로 역치가

Mat mask(imgToProcess.rows, imgToProcess.cols, CV_8U); 
cvtColor(imgToProcess, mask, CV_RGB2GRAY, 1); //your conversion specifier may vary 
threshold(mask, mask, 0, 255, CV_THRESH_BINARY); 

이 최소 임계 값 (상기 0)가 조정될 수있다. JPEG 이미지를 사용하는 경우 인코딩 노이즈를 고려하여 이미지를 약간 늘려야 할 수 있습니다.

+0

포인터를 다시 나타냅니다. 노이즈 및 마스킹 : blur() 또는 GaussianBlur()로 필터링하면 임계 값을 높이는 것보다 결과가 더 좋아질 가능성이 높습니다. 또한 다른 질문 및 현재의 연구에서 발견되는 더 많은 접근 방법이 있습니다. – FvD