GPU-based Gradient Vector Flow using OpenCL

Illustration of Gradient Vector Flow performed on an image. The colors represents the vector direction.

Gradient Vector Flow (GVF) is a feature-preserving diffusion of gradient information. It was originally introduced by Xu and Prince to drive snakes, or active contours, towards edges of interest in image segmentation. However, GVF is also used for detection of tubular structures and skeletonization.

I just recently published an article in the Journal of Real-Time Image Processing entitled “Real-time gradient vector flow on GPUs using OpenCL” describing an optimized OpenCL implementation of Gradient Vector Flow (GVF) that runs on GPUs and CPUs for both 2D and 3D.

Conclusions from the project

  • The implementation benefits a lot from using textures due to caching
  • The OpenCL texture/image format CL_SNORM_INT16 has a big impact on performance as it halves the memory usage and has only a small impact on accuracy.
  • Using shared memory actually makes the calculations slower due to expensive synchronization
  • NVIDIA doesn’t support writing to 3D textures inside a kernel, this makes AMD GPUs much better at this type of processing.

A preprint of the article can be downloaded from here. The final publication is available at link.springer.com

The source code is available at: https://github.com/smistad/OpenCL-GVF/

See also my posts on a 3D matlab implementation of GVF and using textures in OpenCL.

Download and compile

# Install some dependencies
sudo apt-get install git g++ cmake libgtk2.0-dev
 
# Download source code
git clone git://github.com/smistad/OpenCL-GVF.git
cd OpenCL-GVF
 
# Fetch the submodules
git submodule init
git submodule update
 
# Compile
cmake CMakeLists.txt
make

Usage

Note: The default implementation will use a 32-bit floating point storage format, but if -16bit is specified it will use a 16-bit storage format (CL_SNORM_INT16). Use –device gpu to use the GPU or –device cpu to use the CPU. mu is the GVF parameter \(\mu\). Usually set to a value between 0.0 and 0.2 for 2D images and 0.0 and 0.05 for 3D images.

For 2D images

./GVF filename.jpg mu #iterations [-16bit] [--device cpu/gpu]

For 3D images

./GVF filename.raw size_x size_y size_z mu #iterations [-16bit] [--device cpu/gpu]
 
./GVF filename.mhd mu #iterations [-16bit] [--device cpu/gpu]

You may also like...

37 Responses

  1. DUAN says:

    hi, i have just tested the code using lung CT scans , and write the result of GVF components in mhd, but it seems the result of the X,Y,Z components are the same. So what’s wrong?

    • DUAN says:

      Sorry, I have found that it’s the problem of my save code. And I have corrected it. Buy the way, what format is suitable for lung CT when calculate the GVF. In HU stored or pixels stored(unsigned short)?

  2. EVEN says:

    Hi,
    I have try this code on ubuntu. And there is a error when read .mhd file and creat the class Volume::Volume at line 353 of Core.hpp. The error is “Program received signal SIGABRT, Aborted.
    0x00007ffff5cf61c7 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:55
    “. So what should I do

  3. EVEN says:

    Hi,
    I used your code on the vs2010. I have install the gtk and opencl and have passed the compiling of cmake. But when I open the .sln file and compile the main.cpp. There are few mistake:
    1>..\..\OpenCLUtilities\openCLGLUtilities.cpp(22): error C3861: “wglGetCurrentContext”: identifier not found
    1>..\..\OpenCLUtilities\openCLGLUtilities.cpp(24): error C3861: “wglGetCurrentDC”: identifier not found
    2>..\..\SIPL\Core.cpp(133): error C3861: “g_thread_new”: identifier not found
    1>..\..\OpenCLUtilities\histogram-pyramids.cpp(26): error C3861: “log2”: identifier not found
    1>..\..\OpenCLUtilities\histogram-pyramids.cpp(26): error C3861: “round”: identifier not found
    But I think I have include the .h file so where is the problem? Thanks in advance.

    • Erik Smistad says:

      I haven’t tried to compile this code on windows.

      The functions log2 and round doesn’t exist in the std library on windows, but you can easily make them yourself. log2(x) can simply be replaced by log(x)/log(2). For round:

      double round(double number) {
      return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5); }

      The missing wgl functions:
      Add #include after #if _WIN32 in openCLGLUtilities.hpp, you may also need to #include .

      For g_thread_new, not entirely sure... but make sure #include is in Core.cpp

      • EVEN says:

        It seems this code can be only used in a Linux platform, because in the windows it just can not include some head file, such as the X11/Xlib.h. So did you have a version which can be used in windows, or how can I adjust the code so that it can be used in windows.

  4. m says:

    $cat main.cpp
    #define CL_USE_DEPRECATED_OPENCL_1_1_APIS
    #include
    #include “OpenCLUtilities/openCLUtilities.hpp”
    #include
    #include
    #include
    #include
    #include
    #include “SIPL/Core.hpp”
    using namespace cl;
    etc…..

    $ make
    [ 42%] Built target OCL-Utilities
    [ 85%] Built target SIPL
    Scanning dependencies of target GVF
    [100%] Building CXX object CMakeFiles/GVF.dir/main.cpp.o
    Linking CXX executable GVF
    CMakeFiles/GVF.dir/main.cpp.o: In function `cl::Image2D::Image2D(cl::Context const&, unsigned long, cl::ImageFormat, unsigned long, unsigned long, unsigned long, void*, int*)’:
    /usr/include/CL/cl.hpp:3807: undefined reference to `clCreateImage’
    CMakeFiles/GVF.dir/main.cpp.o: In function `cl::Image3D::Image3D(cl::Context const&, unsigned long, cl::ImageFormat, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, void*, int*)’:
    /usr/include/CL/cl.hpp:4076: undefined reference to `clCreateImage’
    CMakeFiles/GVF.dir/main.cpp.o: In function `cl::detail::ReferenceHandler::release(_cl_device_id*)’:
    /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
    /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
    /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
    /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
    /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
    CMakeFiles/GVF.dir/main.cpp.o:/usr/include/CL/cl.hpp:1573: more undefined references to `clReleaseDevice’ follow
    CMakeFiles/GVF.dir/main.cpp.o: In function `cl::detail::ReferenceHandler::retain(_cl_device_id*)’:
    /usr/include/CL/cl.hpp:1562: undefined reference to `clRetainDevice’
    OpenCLUtilities/libOCL-Utilities.a(openCLUtilities.cpp.o): In function `cl::detail::ReferenceHandler::retain(_cl_device_id*)’:
    openCLUtilities.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE6retainES3_[_ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE6retainES3_]+0x14): undefined reference to `clRetainDevice’
    OpenCLUtilities/libOCL-Utilities.a(openCLUtilities.cpp.o): In function `cl::detail::ReferenceHandler::release(_cl_device_id*)’:
    openCLUtilities.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_[_ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_]+0x14): undefined reference to `clReleaseDevice’
    collect2: error: ld returned 1 exit status
    make[2]: *** [GVF] Error 1
    make[1]: *** [CMakeFiles/GVF.dir/all] Error 2
    make: *** [all] Error 2

  5. m says:

    Can you help? When i run make on ubuntu 14.04
    $ make
    [ 50%] Built target OCL-Utilities
    [ 83%] Built target SIPL
    [100%] Building CXX object CMakeFiles/GVF.dir/main.cpp.o
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp: In function ‘int main(int, char**)’:
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp:489:78: error: ‘IntensityTransformation’ is not a member of ‘SIPL’
    SIPL::Volume * volume = new SIPL::Volume(filename, SIPL::IntensityTransformation(SIPL::NORMALIZED));
    ^
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp:489:108: error: ‘NORMALIZED’ is not a member of ‘SIPL’
    SIPL::Volume * volume = new SIPL::Volume(filename, SIPL::IntensityTransformation(SIPL::NORMALIZED));
    ^
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp:504:18: error: ‘class SIPL::Volume’ has no member named ‘display’
    GVF->display(0, 0.1);
    ^
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp:512:24: error: ‘class SIPL::Volume’ has no member named ‘display’
    magnitude->display();
    ^
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp:522:18: error: ‘class SIPL::Image’ has no member named ‘display’
    GVF->display(0, 0.1);
    ^
    /media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-master/OpenCL-GVF-master/main.cpp:528:24: error: ‘class SIPL::Image’ has no member named ‘display’
    magnitude->display();
    ^
    make[2]: *** [CMakeFiles/GVF.dir/main.cpp.o] Error 1
    make[1]: *** [CMakeFiles/GVF.dir/all] Error 2
    make: *** [all] Error 2
    msialma@LinuxPC:/media/msialma/AE88408B884053CD/Users/WIN7/Dropbox/Public/isicg/Σύνθεση_Ρεαλιστικής_Εικόνας/Project/OpenCL-GVF-maste
    r/OpenCL-GVF-master$

    • m says:

      After re-downloading and compiling i get the following:

      make
      Scanning dependencies of target OCL-Utilities
      [ 14%] Building CXX object OpenCLUtilities/CMakeFiles/OCL-Utilities.dir/openCLUtilities.cpp.o
      [ 28%] Building CXX object OpenCLUtilities/CMakeFiles/OCL-Utilities.dir/openCLGLUtilities.cpp.o
      /home/msialma/OpenCL-GVF/OpenCLUtilities/openCLGLUtilities.cpp: In function ‘cl::Device getValidGLCLInteropDevice(cl::Platform, cl_context_properties*)’:
      /home/msialma/OpenCL-GVF/OpenCLUtilities/openCLGLUtilities.cpp:82:79: warning: ‘void* clGetExtensionFunctionAddress(const char*)’ is deprecated (declared at /usr/include/CL/cl.h:1207) [-Wdeprecated-declarations]
      clGetGLContextInfoKHR_fn glGetGLContextInfo_func = (clGetGLContextInfoKHR_fn)clGetExtensionFunctionAddress(“clGetGLContextInfoKHR”);
      ^
      /home/msialma/OpenCL-GVF/OpenCLUtilities/openCLGLUtilities.cpp:82:132: warning: ‘void* clGetExtensionFunctionAddress(const char*)’ is deprecated (declared at /usr/include/CL/cl.h:1207) [-Wdeprecated-declarations]
      clGetGLContextInfoKHR_fn glGetGLContextInfo_func = (clGetGLContextInfoKHR_fn)clGetExtensionFunctionAddress(“clGetGLContextInfoKHR”);
      ^
      [ 42%] Building CXX object OpenCLUtilities/CMakeFiles/OCL-Utilities.dir/histogram-pyramids.cpp.o
      Linking CXX static library libOCL-Utilities.a
      [ 42%] Built target OCL-Utilities
      Scanning dependencies of target SIPL
      [ 57%] Building CXX object SIPL/CMakeFiles/SIPL.dir/Core.cpp.o
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp: In function ‘void SIPL::Init()’:
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp:129:28: warning: ‘GMutex* g_mutex_new()’ is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:273) [-Wdeprecated-declarations]
      windowCountMutex = g_mutex_new();
      ^
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp:129:40: warning: ‘GMutex* g_mutex_new()’ is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:273) [-Wdeprecated-declarations]
      windowCountMutex = g_mutex_new();
      ^
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp:130:21: warning: ‘GMutex* g_mutex_new()’ is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:273) [-Wdeprecated-declarations]
      initMutex = g_mutex_new();
      ^
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp:130:33: warning: ‘GMutex* g_mutex_new()’ is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:273) [-Wdeprecated-declarations]
      initMutex = g_mutex_new();
      ^
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp:131:25: warning: ‘GCond* g_cond_new()’ is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:277) [-Wdeprecated-declarations]
      initCondition = g_cond_new();
      ^
      /home/msialma/OpenCL-GVF/SIPL/Core.cpp:131:36: warning: ‘GCond* g_cond_new()’ is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:277) [-Wdeprecated-declarations]
      initCondition = g_cond_new();
      ^
      [ 71%] Building CXX object SIPL/CMakeFiles/SIPL.dir/Types.cpp.o
      [ 85%] Building CXX object SIPL/CMakeFiles/SIPL.dir/Visualization.cpp.o
      Linking CXX static library libSIPL.a
      [ 85%] Built target SIPL
      Scanning dependencies of target GVF
      [100%] Building CXX object CMakeFiles/GVF.dir/main.cpp.o
      make[2]: *** No rule to make target `/usr/lib/x86_64-linux-gnu/libGL.so’, needed by `GVF’. Stop.
      make[1]: *** [CMakeFiles/GVF.dir/all] Error 2
      make: *** [all] Error 2

      • m says:

        I fixed it with:
        $ sudo rm /usr/lib/x86_64-linux-gnu/libGL.so
        $ sudo ln -s /usr/lib/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so

        Now i have the following error: (my nvidia 9600gt driver suports opencl ver 1.1 not 1.2)
        make
        [ 42%] Built target OCL-Utilities
        [ 85%] Built target SIPL
        Linking CXX executable GVF
        CMakeFiles/GVF.dir/main.cpp.o: In function `Image3D’:
        /usr/include/CL/cl.hpp:4076: undefined reference to `clCreateImage’
        CMakeFiles/GVF.dir/main.cpp.o: In function `Image2D’:
        /usr/include/CL/cl.hpp:3807: undefined reference to `clCreateImage’
        /usr/include/CL/cl.hpp:3807: undefined reference to `clCreateImage’
        /usr/include/CL/cl.hpp:3807: undefined reference to `clCreateImage’
        /usr/include/CL/cl.hpp:3807: undefined reference to `clCreateImage’
        CMakeFiles/GVF.dir/main.cpp.o:/usr/include/CL/cl.hpp:3807: more undefined references to `clCreateImage’ follow
        CMakeFiles/GVF.dir/main.cpp.o: In function `cl::detail::ReferenceHandler::release(_cl_device_id*)’:
        /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
        /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
        /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
        /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
        /usr/include/CL/cl.hpp:1573: undefined reference to `clReleaseDevice’
        CMakeFiles/GVF.dir/main.cpp.o:/usr/include/CL/cl.hpp:1573: more undefined references to `clReleaseDevice’ follow
        CMakeFiles/GVF.dir/main.cpp.o: In function `cl::detail::ReferenceHandler::retain(_cl_device_id*)’:
        /usr/include/CL/cl.hpp:1562: undefined reference to `clRetainDevice’
        OpenCLUtilities/libOCL-Utilities.a(openCLUtilities.cpp.o): In function `cl::detail::ReferenceHandler::retain(_cl_device_id*)’:
        openCLUtilities.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE6retainES3_[_ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE6retainES3_]+0x14): undefined reference to `clRetainDevice’
        OpenCLUtilities/libOCL-Utilities.a(openCLUtilities.cpp.o): In function `cl::detail::ReferenceHandler::release(_cl_device_id*)’:
        openCLUtilities.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_[_ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_]+0x14): undefined reference to `clReleaseDevice’
        collect2: error: ld returned 1 exit status
        make[2]: *** [GVF] Error 1
        make[1]: *** [CMakeFiles/GVF.dir/all] Error 2
        make: *** [all] Error 2

        • Erik Smistad says:

          Try to add the following line at the top in main.cpp, before all #include statements:
          #define CL_USE_DEPRECATED_OPENCL_1_1_APIS

  6. m says:

    On ubuntu 14.04 how should i compile with g++ when i get the following?

    fatal error: CL/cl.h: No such file or directory
    #include

    • Erik Smistad says:

      You can install the package opencl-headers and try again:
      sudo apt-get install opencl-headers

      Or you can supply the include dir of your installed opencl sdk to g++:
      g++ -I /path/to/your/opencl/SDK/include/ ...

  7. m says:

    When i run cmake on ubuntu 14.04 i get the following:
    cmake CMakeLists.txt
    — The C compiler identification is GNU 4.8.2
    — The CXX compiler identification is GNU 4.8.2
    — Check for working C compiler: /usr/bin/cc
    — Check for working C compiler: /usr/bin/cc — works
    — Detecting C compiler ABI info
    — Detecting C compiler ABI info – done
    — Check for working CXX compiler: /usr/bin/c++
    — Check for working CXX compiler: /usr/bin/c++ — works
    — Detecting CXX compiler ABI info
    — Detecting CXX compiler ABI info – done
    — Try OpenMP C flag = [-fopenmp]
    — Performing Test OpenMP_FLAG_DETECTED
    — Performing Test OpenMP_FLAG_DETECTED – Success
    — Try OpenMP CXX flag = [-fopenmp]
    — Performing Test OpenMP_FLAG_DETECTED
    — Performing Test OpenMP_FLAG_DETECTED – Success
    — Found OpenMP: -fopenmp
    — OpenMP was detected. Using OpenMP to speed up MIP calculations.
    — Compiling SIPL with GTK
    — Found PkgConfig: /usr/bin/pkg-config (found version “0.26”)
    — checking for modules ‘gtk+-2.0;gthread-2.0’
    — found gtk+-2.0, version 2.24.23
    — found gthread-2.0, version 2.40.0
    — Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
    — Found OpenCL: /usr/lib/libOpenCL.so
    — Looking for XOpenDisplay in /usr/lib/x86_64-linux-gnu/libX11.so;/usr/lib/x86_64-linux-gnu/libXext.so
    — Looking for XOpenDisplay in /usr/lib/x86_64-linux-gnu/libX11.so;/usr/lib/x86_64-linux-gnu/libXext.so – found
    — Looking for gethostbyname
    — Looking for gethostbyname – found
    — Looking for connect
    — Looking for connect – found
    — Looking for remove
    — Looking for remove – found
    — Looking for shmat
    — Looking for shmat – found
    — Looking for IceConnectionNumber in ICE
    — Looking for IceConnectionNumber in ICE – found
    — Found X11: /usr/lib/x86_64-linux-gnu/libX11.so
    CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
    Could NOT find OpenGL (missing: OPENGL_INCLUDE_DIR)
    Call Stack (most recent call first):
    /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
    /usr/share/cmake-2.8/Modules/FindOpenGL.cmake:161 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
    OpenCLUtilities/CMakeLists.txt:19 (find_package)

    — Configuring incomplete, errors occurred!

  8. Lalita says:

    Thank you very much. The issue has been solved.

  9. Lalita says:

    The same data in Matlab can get the result. My dispaly card is GTX 460.
    This issue makes me confused. Do you have some advice?

    • Erik Smistad says:

      I discovered and fixed a bug which occured only for NVIDIA GPUs and other devices that doesn’t support 3d texture writing. This bug was probably the source of your problems. Try downloading the latest code from https://github.com/smistad/OpenCL-GVF and see if it works for you now.

  10. Lalita says:

    mu = 0.1, iteration = 100
    I also try to change the value of mu and iteration, but it doesn’t work.
    change the cube to 128*128*128, set the central voxel value 1, (64*64*64), half of the total cube. the other value 0. It also from 128*128*96 to the end, the results is zero.

  11. vk says:

    Thank you, Erik!!

    • Anonymous says:

      Hi Erik,
      Thank you for your sharing, they are useful for me.
      I have two questions:
      1. Whether the results of the same input data running use MATLAB and Visual Studio are completely same. I tested cube data generated by myself, the results show that they are not same.
      2. I generated the cube data, the size of 64*64*64, the center voxel is 255 (32*32*32, from index 16 to 47 for each dimension), the other voxel is 0. When I run the program on Visual Studio,which use CMAKE obtained, the results are always 0, form index 48 to 63.

      Looking forwad your replay. Thank you.

      • Erik Smistad says:

        Hi

        1. The results are most likely never identical. One thing that is different with matlab is that it uses double precision (64 bit) by default, while the GPU GVF implementation here uses 16 or 32 bit. However, you can force the use of 32 bit in matlab with the single function.

        2. That is off course incorrect and it is probably because you are sending in data that is not normalized (in the range 0 to 1). The GVF implementation here assumes that data you send in is normalized (should probably put that in the text). I.e. you use the value 255, while it should be 1 instead. The Matlab code normalizes the code for you. (f = (f-min(f(:)))/(max(f(:))-min(f(:)));)

        So try to use the value 1 instead of 255 and let me know how it goes.

        Cheers.

        • Lalita says:

          Thank you for your reply.
          For the second question, before using the GVF, the data have been normalized. And I also try 1 instead of 255, but the results has not chaned, the results from 64*64*48 to 64*64*64 still zero.

  12. vk says:

    Hi Erik,
    First of all, thank you for your interesting post. I also read your article that explains your method.

    I was wondering if you also implemented snake’s internal forces in 3D which in combination with 3D GVF can be used to deform a 3D mesh. Despite my several trials to implement it in python, I am unable to get it right. If you have implemented it already, would you mind sharing it?

    Thank you!

  13. karthik uppuluri says:

    I am trying to compile your gvf project following the steps mentioned but on windows environment…I am getting pkg-config errors in cmake…so i tried ti remove SIPL from Cmakelist, but then I get gtk errors …I installed gtk+2 but still I get errors..Am I doing something wrong

Leave a Reply

Your email address will not be published.