2014-03-13 1 views
1

안녕 얘들 아, 나는이 기능에 문제가 생기고있다.이 기능은 사진 캡쳐 후에 호출되며 이제는 거리 변환을 위해 이미지의 데이터를 사용하고 싶다. 그리고 문제가 어디 있는지 아는 정확한 수를 계산하지만 문제가 Imgproc.cvtColor (m, mGray, Imgproc.COLOR_BGRA2GRAY) 때 내가 디버그 프로그램이 시점에서 실행 중지 그래서 제발 대답 해주세요 너는 뭔가를 발견했다. 사전onPictureTaken()에서 오류가 발생했습니다. 문제는 RGB를 회색으로 변환 할 수 없으므로 cvtcolor() 함수에서 프로그램 실행을 중단하십시오.

@Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.i(TAG, "Divyesh Saving a bitmap to file"); 
     // The camera preview was automatically stopped. Start it again. 
     mCamera.startPreview(); 
     Log.i(TAG, "Divyesh Start preview"); 
     mCamera.setPreviewCallback(this); 
     Log.i(TAG, "Divyesh Start preview callback"); 
     // Write the image in a file (in jpeg format) 
     try { 
      FileOutputStream fos = new FileOutputStream(mPictureFileName); 
      Log.i(TAG, "Divyesh FOS open"); 

      fos.write(data); 
      Log.i(TAG, "Divyesh FOS write"); 
      Mat photo = new Mat(); 
      Log.i(TAG, "Divyesh Mat photo = new Mat()"); 
      photo.put(0, 0, data); 
      Log.i(TAG, "Divyesh photo.put"); 

      m = new Mat(photo.height(), photo.width(), CvType.CV_8U,new Scalar(4)); 
      Log.i(TAG, "Divyesh Mat value of M and height width"); 
      //Bitmap myBitmap32 = photo.copy(Bitmap.Config.ARGB_8888, true); 
      //Utils.bitmapToMat(myBitmap32, m); 


        Imgproc.cvtColor(m, mGray, Imgproc.COLOR_BGRA2GRAY); 
        Log.i(TAG, "Divyesh CVTCOLOR"); 
        Imgproc.distanceTransform(mGray, mBin, Imgproc.DIST_LABEL_PIXEL, 3); 
        Core.normalize(mBin, mBin, 0, 1., Core.NORM_MINMAX); 
        Imgproc.threshold(mBin, mBin, .5, 1., Imgproc.THRESH_BINARY); 
        mBin.convertTo(dist_8u, CvType.CV_8U); 
        hierarchy = new Mat(); 
        temp = dist_8u; 
        Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
        fu = contours.size(); 
        Log.i(TAG, fu + "finally got no of objects"); 



      fos.close(); 

     } catch (java.io.IOException e) { 
      Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 


    } 

} 

및 로그 캣

03-14 11:11:39.089: D/CameraBridge(2350): mStretch value: 1.0 
03-14 11:11:39.109: D/JavaCameraView(2350): Preview Frame received. Frame size: 115200 
03-14 11:11:39.149: D/CameraBridge(2350): mStretch value: 1.0 
03-14 11:11:39.149: I/OCVSample::Activity(2350): onTouch event 
03-14 11:11:39.159: I/Sample::Tutorial3View(2350): Taking picture 
03-14 11:11:39.969: I/Sample::Tutorial3View(2350): Divyesh Saving a bitmap to file 
03-14 11:11:40.209: I/Sample::Tutorial3View(2350): Divyesh Start preview 
03-14 11:11:40.209: I/Sample::Tutorial3View(2350): Divyesh Start preview callback 
03-14 11:11:40.219: I/Sample::Tutorial3View(2350): Divyesh FOS open 
03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh FOS write 
03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh Mat photo = new Mat() 
03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh photo.put 
03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh Mat value of M and height width 
03-14 11:11:40.229: D/AndroidRuntime(2350): Shutting down VM 

답변

1

당신은 캡처 크기를 언급하지 않습니다에 감사하지만, Frame size 로그에서 같아요 320 × 240이다. Android 캡처에서는 일반적으로 RGBA가 아니고 YV12입니다. 따라서 size=width x height x bits_per_pixel = 320 x 240 x 1.5 = 115200. 이 경우 잘못된 형식의 변환을 사용하고 있으므로 YC12가 OpenCV에 의해 평면으로 잘못 해석되기 때문에 1 채널 입력 Mat을 사용하고 다음 (이 코드는 C++이지만 아이디어를 얻습니다.)을 사용해야합니다.

cv::Mat yv12_image(height, width, CV_8UC1, input_buffer); 
cv::Mat rgb_image; 
cv::cvtColor(yv12_image, rgb_image, CV_YUV2RGB_YV12); 

(RGB 대 BGR btw와 조심하십시오). YUV에서 Gray 로의 직접 변환이 cvtColor에 없다는 것을 상기 할 수 있습니다.이 경우 입력 버퍼를 걸러서 속도가 느릴 수있는 공식을 통해 변환하거나 위의 코드를 실행하십시오 (Java로 변환 됨) 그런 다음 cvtColor을 RGB에서 회색으로 처리하십시오.

+0

고독한 형제, 나는 단 하나 대답하기를 기대하지 않고 있었다. 그래서 고맙습니다. 많이 시도해 봅니다 .... – Div

+0

변환이 완료되었지만 이제는 오류가 거리 변환 선에옵니다 ... 해결할 수 있도록 도와 주시겠습니까? – Div

+0

다른 질문을 쓸 수 있습니까? 색인 생성이 더 쉽습니다 ... – miguelao

관련 문제