2013-04-17 1 views
2

Я пытаюсь сохранить изображение OpenCV на жесткий диск.Как сохранить (cvWrite или imwrite) изображение в OpenCV 2.4.3?

Вот что я пробовал:

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

Скорее всего, вам нужно будет добавить разрешения доступа к SDK для вашего манифеста. –

+0

Я не делаю этого на телефоне Android. Я только что получил вышеприведенный образец из другой тенденции, задав вопрос, который я задаю для телефона Android. Что я просто хочу сделать, это сохранить обрезанное лицо от кода обнаружения лица в качестве нового изображение, используя функцию, аналогичную описанной выше, но используя IplImage * на рабочем столе, а не Android. Спасибо за ответ. – Sisay

+0

Highgui заменяется Imgcodecs версии 3. mRgba на самом деле является входным мат. http://stackoverflow.com/questions/25059576/highgui-path-is-missing-in-opencv-3-0-0-generated-jar-classnotfoundexception-or – profimedica

ответ

5

Ваш вопрос немного запутанный, так как ваш вопрос касается OpenCV на рабочем столе, но ваш код для Android, и вы спрашиваете об IplImage, но ваш опубликованный код использует C++ и Mat. Предполагая, что вы находитесь на рабочем столе с помощью C++, вы можете сделать что-то вдоль линий:

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... 
} 

Формат изображения выбирается на основе предоставленное имя файла, например если ваша строка store_path была «output_image.png», то imwrite сохранит это изображение PNG. Вы можете увидеть список действительных расширений: the OpenCV docs.

Остерегайтесь того, что при записи изображений на диск с помощью OpenCV масштабирование будет отличаться в зависимости от типа Mat; то есть для плавающих изображений предполагается, что изображения находятся в пределах диапазона [0, 1], а, скажем, без знака, они будут от [0, 256].

Для IplImages я бы посоветовал просто переключиться на использование Mat, поскольку старый C-интерфейс устарел. Вы можете преобразовать IplImage в Mat через cvarrToMat, затем использовать Mat, например.

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

поочередно, вы можете преобразовать IplImage к мату только с

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

Кроме того, я только что заметил this tutorial на сайте OpenCV, который дает вам ходить, хотя при загрузке и сохранения изображений в (рабочий стол).

+1

Большое вам спасибо. Это все, что я хочу, и вы ответили на мой вопрос. Я работаю над Face Recognition, и поскольку openCv 2.4.3 имеет API-интерфейс Face Recognizer в отличие от версии OpenCV 2.3.x.Changing IplImage * in to cv :: Mat format и сохранение изображения в качестве мата сделает моя жизнь проще. Поскольку API FaceRecognizer использует cv :: Mat input.Thanks alot alrikai. – Sisay

+1

рад слышать, что это помогло! Я бы также посоветовал прочитать документацию OpenCV на своем сайте (http://opencv.org/documentation.html), у них есть много хорошей информации, чтобы получить вас. – alrikai

+0

хорошо спасибо! – Sisay