2013-04-17 2 views
2

OpenCV 이미지를 하드 드라이브에 저장하려고합니다.OpenCV 2.4.3에서 이미지를 저장 (cvWrite 또는 imwrite)하는 방법은 무엇입니까?

public void SaveImage (Mat mat) { 
    Mat mIntermediateMat = new Mat(); 

    Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3); 

    File path = 
    Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_PICTURES); 
    String filename = "barry.png"; 
    File file = new File(path, filename); 

    Boolean bool = null; 
    filename = file.toString(); 
    bool = Highgui.imwrite(filename, mIntermediateMat); 

    if (bool == true) 
    Log.d(TAG, "SUCCESS writing image to external storage"); 
    else 
    Log.d(TAG, "Fail writing image to external storage"); 
    } 
} 

어느 한 쇼가 방법을 OpenCV 2.4.3로 해당 이미지를 저장할 수 : 여기

내가 시도 무엇인가?

+0

아마도 대부분 매니페스트에 sdcard 액세스 권한을 추가해야합니다. –

+0

안드로이드 폰에서이 작업을 수행하지 않습니다. 나는 다른 트렌드에서 위의 샘플을 얻었습니다. 나는 안드로이드 폰을 요구하고 있습니다. 단지 내가하고 싶은 것은, 얼굴 검출 코드에서 자른 얼굴을 새로운 것으로 저장하는 것입니다. 위의 것과 똑같은 기능을 사용하지만 안드로이드가 아닌 데스크탑에서 IplImage *를 사용하는 이미지. 응답은 감사합니다. – Sisay

+0

Highgui가 버전 3의 Imgcodecs로 대체되었습니다. mRgba는 실제로 입력 매트입니다. http://stackoverflow.com/questions/25059576/highgui-path-is-missing-in-opencv-3-0-0-generated-jar-classnotfoundexception- 또는 – profimedica

답변

5

당신의 질문은 데스크톱의 OpenCV에 관한 것이지만 귀하의 코드는 Android 용이며 IplImage에 관해서는 질문했지만 게시 된 코드는 C++과 Mat을 사용하고 있습니다.

cv::Mat image; 
std::string image_path; 
//load/generate your image and set your output file path/name 
//... 

//write your Mat to disk as an image 
cv::imwrite(image_path, image); 

... 아니면 더 완전한 예를 들면 다음과 같습니다 :

void SaveImage(cv::Mat mat) 
{ 
    cv::Mat img;  
    cv::cvtColor(...); //not sure where the variables in your example come from 
    std::string store_path("..."); //put your output path here  

    bool write_success = cv::imwrite(store_path, img); 
    //do your logging... 
} 

이미지 형식이 선택의 기반이되는 당신의 C++를 사용하여 데스크탑에있어 가정, 당신의 라인을 따라 뭔가를 할 수 제공된 파일 이름, 예. store_path 문자열이 "output_image.png"이면 imwrite는 PNG 이미지를 저장합니다. 유효한 내선 번호 목록은 the OpenCV docs입니다.

OpenCV를 사용하여 이미지를 디스크에 기록 할 때주의해야 할 점은 매트 유형에 따라 배율이 달라진다는 것입니다. 즉, float의 경우 이미지는 [0, 1] 범위 내에 있어야합니다. 반면에 unsigned chars는 [0, 256]입니다.

IplImages의 경우 이전 C 인터페이스가 사용되지 않으므로 Mat를 사용하도록 전환하는 것이 좋습니다. cvarrToMat을 통해 IplImage를 매트로 변환 한 다음 매트를 사용할 수 있습니다 (예 : 매트).

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1); 
Mat newC = cvarrToMat(oldC0); 
//now can use cv::imwrite with newC 

교대로, 당신은 단지

Mat newC(oldC0); //where newC is a Mat and oldC0 is your IplImage 

와 매트에 IplImage을 변환 할 수 있습니다 또한 난 그냥에서로드 및 이미지 저장에 당신에게 걸어하지만를 제공하는 OpenCV의 웹 사이트에서 this tutorial을 발견 (데스크탑) 환경.

+1

정말 고마워요.이 모든 것이 내가 원하는 것입니다. 내 질문에 대답했다. 나는 얼굴 인식 작업을하고 openCv 2.4.3에는 openCV 버전 2.3.x와 달리 Face Recognizer API가있다. IplImage *를 cv :: Mat 형식으로 변경하고 이미지를 매트로 저장하면 FaceRecognizer API가 cv :: Mat input을 사용하기 때문에. 감사합니다. – Sisay

+1

도움이 된 것을 기쁘게 생각합니다! 나는 또한 그들의 사이트 (http://opencv.org/documentation.html)에서 OpenCV 문서를 읽는 것이 좋습니다, 그들은 당신에게 좋은 정보가 많이 있습니다. – alrikai

+0

ok 감사합니다! – Sisay

관련 문제