1 | initial version |
Hi!
This is a crazy one, but possible to achieve.
Note: a feature like this one has to be treated as experimental. It is a proof of concept, based upon non-official ways of "doing things with RenderScript".
I created this example just for this case: https://bitbucket.org/cmaster11/rsbookexamples/src/tip/OpenCVInteropExample/
Main file, for reference: MainActivity.java
The concept of this example is based upon the RenderScript (RS) ability to instantiate an Allocation using a user-provided data pointer.
What the sample project does is:
Note: please, refer to the README.md
, which comes together with the example, to have it work correctly. It requires you to download the OpenCV SDK.
The ability to support a user-provided data pointer is dependent upon the RS device-specific driver. When tested on a Galaxy Note 3 (Android 5.1), it didn't work. There is a high chance that later versions of Android provide good support for this functionality.
This functionality works by enabling the RS support library at the cost of using a non-performant RS driver.
The process of binding a RS allocation to a user-provided pointer can be achieved by directly calling the native RS function RenderScript.nAllocationCreateTyped
and passing it, as last argument, the pointer address to the user data (in this case, the OpenCV mat data pointer).
This process, however, requires the usage of Java reflection:
Reference: RenderScript: parallel computing on Android, the easy way
2 | No.2 Revision |
Hi!
This is a crazy one, but possible to achieve.
Note: a feature like this one has to be treated as experimental. It is a proof of concept, based upon non-official ways of "doing things with RenderScript".
I created this example just for this case: https://bitbucket.org/cmaster11/rsbookexamples/src/tip/OpenCVInteropExample/
Main file, for reference: MainActivity.java
The concept of this example is based upon the RenderScript (RS) ability to instantiate an Allocation using a user-provided data pointer.
Inside RenderScript source code, you can see one method declaration:
long nAllocationCreateTyped(long type, int mip, int usage, long pointer)
The last argument, pointer
, can be used to tell RenderScript that it should create a new Allocation, pointing at a certain memory address. Binding this behavior with OpenCV, where you can invoke the Mat.dataAddr()
method to get a Mat data pointer, lets you create a RenderScript allocation that completely overlaps the OpenCV mat.
What the sample project does is:
Note: please, refer to the README.md
, which comes together with the example, to have it work correctly. It requires you to download the OpenCV SDK.
The ability to support a user-provided data pointer is dependent upon the RS device-specific driver. When tested on a Galaxy Note 3 (Android 5.1), it didn't work. There is a high chance that later versions of Android provide good support for this functionality.
This functionality works by enabling the RS support library at the cost of using a non-performant RS driver.
The process of binding a RS allocation to a user-provided pointer can be achieved by directly calling the native RS function RenderScript.nAllocationCreateTyped
and passing it, as last argument, the pointer address to the user data (in this case, the OpenCV mat data pointer).
This process, however, requires the usage of Java reflection:
Reference: RenderScript: parallel computing on Android, the easy way
3 | No.3 Revision |
Hi!
This is a crazy one, but possible to achieve.
Note: a feature like this one has to be treated as experimental. It is a proof of concept, based upon non-official ways of "doing things with RenderScript".
I created this example just for this case: https://bitbucket.org/cmaster11/rsbookexamples/src/tip/OpenCVInteropExample/
Main file, for reference: MainActivity.java
The concept of this example is based upon the RenderScript (RS) ability to instantiate an Allocation using a user-provided data pointer.
Inside Short explanation: inside RenderScript source code, you can see one method declaration:
long nAllocationCreateTyped(long type, int mip, int usage, long pointer)
The last argument, pointer
, can be used to tell RenderScript that it should create a new Allocation, pointing at a certain memory address. Binding this behavior with OpenCV, where you can invoke the Mat.dataAddr()
method to get a Mat data pointer, lets you create a RenderScript allocation that completely overlaps the OpenCV mat.
What the sample project does is:
Note: please, refer to the README.md
, which comes together with the example, to have it work correctly. It requires you to download the OpenCV SDK.
The ability to support a user-provided data pointer is dependent upon the RS device-specific driver. When tested on a Galaxy Note 3 (Android 5.1), it didn't work. There is a high chance that later versions of Android provide good support for this functionality.
This functionality works by enabling the RS support library at the cost of using a non-performant RS driver.
The process of binding a RS allocation to a user-provided pointer can be achieved by directly calling the native RS function RenderScript.nAllocationCreateTyped
and passing it, as last argument, the pointer address to the user data (in this case, the OpenCV mat data pointer).
This process, however, requires the usage of Java reflection:
Reference: RenderScript: parallel computing on Android, the easy way