Оттенки серого
Я использую opencv для преобразования растрового изображения Android в grescale с помощью opencv. ниже код, который я использую,
IplImage image = IplImage.create( bm.getWidth(), bm.getHeight(), IPL_DEPTH_8U, 4); //creates default image
bm.copyPixelsToBuffer(image.getByteBuffer());
int w=image.width();
int h=image.height();
IplImage grey=cvCreateImage(cvSize(w,h),image.depth(),1);
cvCvtColor(image,grey,CV_RGB2GRAY);
БМ является исходным изображением. Этот код работает нормально и преобразуется в оттенки серого, я проверил его, сохранив в SDCard, а затем снова загрузив, но когда я пытаюсь загрузить его, используя метод ниже, мое приложение вылетает, любые предложения.
bm.copyPixelsFromBuffer(grey.getByteBuffer());
iv1.setImageBitmap(bm);
iv1 - изображение, где я хочу установить bm.
2 ответа
Я никогда не использовал привязки OpenCV для Android, но вот код, который поможет вам начать. Считайте это псевдокодом, потому что я не могу попробовать... но вы поймете основную идею. Это может быть не самое быстрое решение. Я вставлю из этого ответа.
public static Bitmap IplImageToBitmap(IplImage src) {
int width = src.width;
int height = src.height;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for(int r=0;r<height;r++) {
for(int c=0;c<width;c++) {
int gray = (int) Math.floor(cvGet2D(src,r,c).getVal(0));
bitmap.setPixel(c, r, Color.argb(255, gray, gray, gray));
}
}
return bitmap;
}
Ваш IplImage grey
имеет только один канал, и ваш Bitmap bm
имеет 4 или 3 (ARGB_8888
, ARGB_4444
, RGB_565
). Следовательно bm
не может сохранить изображение в градациях серого. Вы должны преобразовать его в rgba перед использованием.
Пример: (ваш код)
IplImage image = IplImage.create( bm.getWidth(), bm.getHeight(), IPL_DEPTH_8U, 4);
bm.copyPixelsToBuffer(image.getByteBuffer());
int w=image.width(); int h=image.height();
IplImage grey=cvCreateImage(cvSize(w,h),image.depth(),1);
cvCvtColor(image,grey,CV_RGB2GRAY);
Если вы хотите загрузить его:
(Вы можете использовать свой image
или создать другой (temp
))
IplImage temp = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 4); // 4 channel
cvCvtColor(grey, temp , CV_GRAY2RGBA); //color conversion
bm.copyPixelsFromBuffer(temp.getByteBuffer()); //now should work
iv1.setImageBitmap(bm);
Я мог бы это помочь!