|
From: Ingo S. <in...@gm...> - 2022-03-18 17:54:37
|
Hi,
I have managed to pass data from pdl to OpenCV and back by copying. I
would have preferred some kind of mapping but that is not working, see
below. So, technically, there is a working interface to OpenCV., at
least for grayscale floats.
ee the t/basic_opencv.t for what it can do at the moment.
I will get the object tracking working next.
Video in/output is also planned, as is support for other data types, at
least 32fC1/3 8UC1/3 and basic imshow support.
I guess I will be able to generate simple opencv function support
through templates, see ufunc in poencv.pd (yes, I stole that from ops.pd).
So you can use it, but you would still need to write wrapper code
encapsulating OpenCV. I have tried - and failed - using Inline::CPP and
a simple #include <opencv2/core.hpp> which throws all sort of errors.
Most of all redefinitions like seed or cv.
Try compiling this code (g++) and you will see.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "INLINE.h"
#undef seed
using namespace std;
#include <opencv2/core.hpp>
On 3/16/2022 4:55 PM, Ingo Schmid wrote:
>
> Hi Ed,
>
> thank you. I have made some progress but getting data from a cv:Mat to
> a PDL is a mystery still. If you could look at the code I would
> appreciate it. I have a valid pointer to the data, either in C or
> perl, but how to make a piddle use that as it's dataref is beyond me.
>
>
> Ingo
>
> On 3/15/22 21:50, Ed . wrote:
>>
>> Hi Ingo,
>>
>>
>>
>> Glad you’re making progress!
>>
>>
>>
>> The problem you’re having here is that you’re somewhat mixing your
>> metaphors. For now, PDL mainly uses SVs for storing data. The
>> “datasv” member of the struct points at the data SV, and the “data”
>> member is set to point at its PV. Within e.g. the readdata function,
>> a local C variable for the data pointer of ndarray “m” is created
>> called “m_datap”, which gets updated during broadcasting. The “$P(m)”
>> macro in PP expands to “m_datap”.
>>
>>
>>
>> As you may now appreciate, assigning to that is not going to have any
>> long-term effect once the function returns. You’re going to need a
>> different approach. One that will operate somewhat, but isn’t the
>> correct answer, is to assign to “$PDL(m)->data” instead. But you’re
>> going to need to do memory-management properly, otherwise you’ll get
>> segfaults and/or leak memory.
>>
>>
>>
>> A more direct way to achieve the aim, staying with the SV model, is
>> to enhance your MatWrapper Perl object (using XS) to be able to
>> return its data (and dimensions as well), and make your get_data be
>> pure-Perl that extracts dims, types and data from the MatWrapper in
>> Perl-land, and uses PDL methods setdims, set_datatype, and
>> get_dataref/upd_data to create an ndarray.
>>
>>
>>
>> Best regards,
>>
>> Ed
>>
>>
>>
>> *From: *Ingo Schmid <mailto:in...@gm...>
>> *Sent: *15 March 2022 19:52
>> *To: *perldl <mailto:pdl...@li...>
>> *Subject: *[Pdl-general] set pointer to data (PP)
>>
>>
>>
>> Hi,
>>
>> I would like to update the pointer to piddle data. I've got a C function
>>
>> void * getData(MatWrapper * mw);
>>
>> that returns the pointer to opencv Mat data. I declare the piddle $m
>> with the right size and data type in PMCode. Now, I can successfully say
>>
>> void * data = getData($COMP(mw));
>>
>> $P(m)=data;
>>
>> and print the right numbers in C.
>>
>> printf("m (48,48) %f\n",$m(k=>48,l=>48)); # 50.842896 - correct.
>>
>> However, after returning to perl, $m(48,48) is 0 and get_dataref
>> shows the wrong datdress. What's the trick to make this permanent?
>>
>> Ingo
>>
>> ==
>>
>> pp_def ('get_data',
>> Pars=>'[o] m(k,l);',
>> OtherPars=>'MatWrapper * mw',
>> Code=>pp_line_numbers(__LINE__,
>> '
>> PDL_Indx ks = $SIZE(k);
>> PDL_Indx ls = $SIZE(l);
>> int x = cols($COMP(mw),-1);
>> int y = rows($COMP(mw),-1);
>> printf ("x %d : ks %d / y %d : ls %d ",x,ks,y,ls);
>> if ((x == ks) && (y == ls))
>> {
>> void * dat;
>> dat = getData($COMP(mw));
>> $P(m)=dat;
>> } else {
>> $CROAK("Matrix size does not match!\n");
>> }
>> printf("m (48,48) %f\n",$m(k=>48,l=>48));
>> '),
>> PMCode=>pp_line_numbers(__LINE__,
>> '
>> sub get_data {
>> my ($mw,$p) = @_;
>> unless (ref ($p) =~ "PDL") {
>> say "rows $mw->rows";
>> $p=zeroes(float,$mw->cols,$mw->rows);
>> }
>> _get_data_int($p,$$mw);
>> say "(get_data) 48,48: ",$p->slice("48","48");
>> $p->upd_data;
>> say "(get_data) 48,48: ",$p->slice("48","48");
>> $p->transpose;
>> }
>> ',),
>> Doc=><<"EOD",
>>
>> =head2 set_data - update data of a Mat object. Size and type should
>> match.
>>
>> EOD
>>
>> );
>>
>>
>>
>>
>>
>
>
> _______________________________________________
> pdl-general mailing list
> pdl...@li...
> https://lists.sourceforge.net/lists/listinfo/pdl-general
|