Оттенки серого - PullRequest
       19

Оттенки серого

1 голос
/ 23 сентября 2011

Я использую 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);

bm - исходное изображение.Этот код работает нормально и преобразуется в оттенки серого, я проверил его, сохранив в SDCard и затем загрузив снова, но когда я пытаюсь загрузить его, используя метод ниже, мое приложение вылетает, любые предложенияimageview, где я хочу установить BM.

Ответы [ 2 ]

0 голосов
/ 30 октября 2013

Ваш 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);

Возможно, это поможет!

0 голосов
/ 14 января 2012

Я никогда не использовал привязки 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;
}
...