<div dir="ltr"><div><p><span style="font-size:11pt;font-family:"calibri","sans-serif";color:rgb(31,73,125)"><span>1)<span style="font:7pt "times new roman"">     
</span></span></span><span style="font-size:11pt;font-family:"calibri","sans-serif";color:rgb(31,73,125)">How
 do we read/write/display images using opencv in VIAME? If you have your
 own APIs handling data IO, it would be fine but we need to learn how to
 convert formats, e.g., to cv::Mat.</span></p>Starting at the algorithm level, KWIVER provides image support using the abstract base class kwiver::vital::image_container defined in "vital/types/image_container.h". Implementations of this class provide support for the actual image data. Since we have support for OpenCvV and VXL, both those image formats are supported. Generally we are using the Opencv image format. Image containers are passed via referecen using the type "kwiver::vital::image_container_sptr".<br><br></div>As an example, the file VIAME/source/packages/kwiver/arrows/ocv/hough_circle_detector.cxx accepts an image container and extracts the cv::Mat. The following is the extracted code snippet.<br><br><div><div><span style="font-family:monospace,monospace">#include <arrows/ocv/image_container.h><br><br>kwiver::vital::detected_object_set_sptr<br>hough_circle_detector::<br>detect( vital::image_container_sptr image_data) const<br>{<br>  cv::Mat src = kwiver::arrows::ocv::image_container::vital_to_ocv( image_data->get_image() );<br>  ...<br></span><br>An OpenCV image can be placed in an image container as shown in the following code snippet.<br><br><span style="font-family:monospace,monospace">#include <arrows/ocv/image_container.h><br><br>vital::image_container_sptr<br>image_io<br>::load_(const std::string& filename) const<br>{<br>  cv::Mat img = cv::imread(filename.c_str());<br>  return vital::image_container_sptr(new kwiver::arrows::ocv::image_container(img));<br>}<br></span><br></div><div>At the pipeline level, there are processes that read and write images.<br><br>frame_list_input: Reads a list of image file names and generates stream of images and associated time stamps<br>image_file_reader: Reads an image file given the file name.<br>image_viewer: Display input image and delay<br>image_writer: Write image to disk.<br><br></div><div>There is a simple pipeline that reads an image and displays it.<br><br>VIAME/source/packages/kwiver/sprokit/pipelines/examples/image_reader.pipe<br><br></div><div>The image_object_detector process handles getting the image container from the pipeline to the detector algorithm instance.<br></div><div>There is an example pipeline that runs the image_object_detector process in the file<br><br>VIAME/source/packages/kwiver/sprokit/pipelines/examples/hough_detector/hough_detector.pipe<br><br></div><div>The code snippet shown below creates a process called "detector" as an instance of "image_object_detector" and selects the detector type "hough_circle_detector". What follows are the configuration parameters for that algorithm.<br></div><div><br><span style="font-family:monospace,monospace">process detector<br>  :: image_object_detector<br>  :detector:type    hough_circle_detector<br>  :detector:hough_circle_detector:dp            1<br>  :detector:hough_circle_detector:min_dist      100<br>  :detector:hough_circle_detector:param1        200<br>  :detector:hough_circle_detector:param2        100<br>  :detector:hough_circle_detector:min_radius    0<br>  :detector:hough_circle_detector:max_radius    0</span><br><br></div><div>Similarly the scallop_tk detector could be selected using the following code snippet<br><br><span style="font-family:monospace,monospace">process detector<br>  :: image_object_detector<br>  :detector:type                              scallop_tk_detector<br>  :detector:scallop_tk_detector:config_file   config_location</span><br><br></div><div>The process name "detector" is the local name that is used when making connections and could be something else if desired.<br></div><div>Note that the configuration items for a particular detector are all prefixed with "detector:<detector-type>:". This allows you to keep inactive configurations in the file when you are experimenting with different algorithm implementations.<br></div><div><br></div><div><p><span style="font-size:11pt;font-family:"calibri","sans-serif";color:rgb(31,73,125)"><span>2)<span style="font:7pt "times new roman"">     
</span></span></span><span style="font-size:11pt;font-family:"calibri","sans-serif";color:rgb(31,73,125)">Our modules provide limited python APIs. I want to know how VIAME called these APIs and pass data back and forth.
</span></p>We have python wrappers for most of the vital types to allow python processes to create the types that are passed in the pipeline. Currently we do not have support to load concrete algorithms written in python.<br><br></div><div>The python process base class can be found at VIAME/source/packages/kwiver/sprokit/processes/bindings/python/kwiver/kwiver_process.py. This base class supports the process related traits. An example python process can be found at "VIAME/source/packages/kwiver/sprokit/processes/python/ApplyDescriptor.py"<br><br></div><div>Best regards,<br></div><div>-Linus<br clear="all"></div><div><br>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><font color="#888888"><b>Linus Sherrill - </b></font><font color="#888888">Staff R&D Engineer<br></font><font color="#888888">Kitware, Inc.<br>28 Corporate Drive<br>Clifton Park, NY 12065-8662<br>E: <a target="_blank">linus.sherrill@kitware.com</a><br>P: 518.881.4400<br></font></div></div></div></div></div>
</div></div></div>