Convert Android camera2 api YUV_420_888 to RGB

后端 未结 7 899
暗喜
暗喜 2020-12-14 02:56

I am writing an app that takes the camera feed, converts it to rgb, in order to do some processing.

It works fine on the old camera implementation which uses NV21 Y

7条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-14 03:12

    As you have not tagged this question as java or ndk. My replie implementation is from ndk or c++ point of view:

    I know you want to convert the AIMAGE_FORMAT_YUV_420_888 to RGB b bits. Instead you can get directly AIMAGE_FORMAT_RGB_888 format if you request for AIMAGE_FORMAT during call to AImageReader_new().

    /* 
     * Callback when image is available for processing 
     */
    static void imageCallback(void* context, AImageReader* reader)
    {
        AImage *image = nullptr;
        auto status = AImageReader_acquireNextImage(reader, &image);
        // Check status here ...
    
        // Try to process data without blocking the callback
        std::thread processor([=](){
    
            uint8_t *data = nullptr;
            int len = 0;
            AImage_getPlaneData(image, 0, &data, &len);
    
            // Process data here
            // ...
    
            AImage_delete(image);
        });
        processor.detach();
    }
    
    /*
     * Create RGB reader 
     */
    AImageReader* createRGBReader()
    {
        AImageReader* reader = nullptr;
        media_status_t status = AImageReader_new(640, 480, AIMAGE_FORMAT_RGB_888,
                         4, &reader);
    
        //if (status != AMEDIA_OK)
            // Handle errors here
    
        AImageReader_ImageListener listener{
                .context = nullptr,
                .onImageAvailable = imageCallback,
        };
    
        AImageReader_setImageListener(reader, &listener);
    
        return reader;
    }
    
    /* 
     * Create the surface for this reader
     */
    ANativeWindow* createSurface(AImageReader* reader) 
    {
        ANativeWindow *nativeWindow;
        AImageReader_getWindow(reader, &nativeWindow);
    
        return nativeWindow;
    }
    
    
    ...
    
    createSession()
    {
        ...
        createSurface(createRGBReader());
        ...
    }
    
    

提交回复
热议问题