ExternalInterface class
This class is the dip::ExternalInterface
for the OpenCV interface.
Contents
- Reference
Use the following code when declaring images to be used as the output to a DIPlib function:
dip_opencv::ExternalInterface cvei; dip::Image img_out0 = cvei.NewImage(); dip::Image img_out1 = cvei.NewImage();
This configures the images img_out0
and img_out1
such that, when they are forged later on, an cv::Mat
object will be created to hold the pixel data.
However, there are many limitations to the images that can be mapped by a cv::Mat
, see the description in the
documentation to the module: DIPlib-OpenCV interface. For these images, the allocator will fail, prompting
DIPlib to use its own, default allocator instead. The resulting dip::Image
object cannot be converted back
to an OpenCV object, though it might be possible to convert parts of it (for example each 2D plane separately).
The dip::ExternalInterface
object owns the cv::Mat
objects. You need to keep it around as long as you use the
image objects returned by its dip_opencv::ExternalInterface::NewImage
method, otherwise the data segments will be freed and the dip::Image
objects will point to non-existing data segments.
To retrieve the cv::Mat
object inside such a dip::Image
, use the dip_opencv::ExternalInterface::GetMat
method:
cv::Mat img0 = cvei.GetMat( img_out0 ); cv::Mat img1 = cvei.GetMat( img_out1 );
If you don’t use the dip_opencv::ExternalInterface::GetMat
method, the cv::Mat
that contains the pixel data will be destroyed when the
dip::Image
object goes out of scope. The GetMat
method returns a cv::Mat
object that owns the data segment
used by the dip::Image
object. In this case, the dip::Image
object is still valid, and shares the data segment
with the extracted cv::Mat
. If the cv::Mat
is destroyed, the data segment will be freed and the dip::Image
object will point to a non-existing data segment.
Remember to not assign a result into the images created with dip_opencv::ExternalInterface::NewImage
, as the pixel data will be copied in the
assignment. Instead, use the DIPlib functions that take output images as function arguments:
img_out0 = in1 + in2; // Bad! Incurs an unnecessary copy dip::Add( in1, in2, img_out0 ); // Correct, the operation writes directly in the output data segment
In the first case, in1 + in2
is computed into a temporary image, whose pixels are then copied into the
cv::Mat
created for img_out0
. In the second case, the result of the operation is directly written into the
cv::Mat
, no copies are necessary.
Base classes
-
class dip::
ExternalInterface abstract - Support for external interfaces.
Functions
- auto GetMat(dip::Image const& img) -> cv::Mat
- Returns the OpenCV
cv::Mat
that holds the data for thedip::Image
img
. - auto NewImage() -> dip::Image
- Constructs a
dip::Image
object with the external interface set so that, when forged, a OpenCVcv::Mat
will be allocated to hold the samples.
Function documentation
cv::Mat GetMat(dip::Image const& img)
Returns the OpenCV cv::Mat
that holds the data for the dip::Image
img
.
The OpenCV cv::Mat
returned is the one allocated to hold the pixel data in the input
img
. If img
is a view of another image, or has been manipulated through dip::Image::Mirror
or
dip::Image::Rotation90
, the pixel data will be copied into a new cv::Mat
object.
If the dip::Image
object does not point to data in a cv::Mat
object, the pixel data will be copied
into a new cv::Mat
object.