connectedcomponents: use opencv integral types, add to docs, fix up things for a python export

pull/135/head
Jason Newton 12 years ago
parent 4c0cb2576d
commit 85880397c4
  1. 42
      modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst
  2. 24
      modules/imgproc/include/opencv2/imgproc/imgproc.hpp
  3. 12
      modules/imgproc/src/connectedcomponents.cpp
  4. 12
      modules/python/src2/cv2.cpp

@ -118,6 +118,48 @@ These values are proved to be invariants to the image scale, rotation, and refle
.. seealso:: :ocv:func:`matchShapes` .. seealso:: :ocv:func:`matchShapes`
connectedComponents
-----------
computes the connected components labeled image of boolean image I with 4 or 8 way connectivity - returns N, the total
number of labels [0, N-1] where 0 represents the background label. L's value type determines the label type, an important
consideration based on the total number of labels or alternatively the total number of pixels.
.. ocv:function:: uint64 connectedComponents(Mat &L, const Mat &I, int connectivity = 8)
.. ocv:function:: uint64 connectedComponentsWithStats(Mat &L, const Mat &I, std::vector<ConnectedComponentStats> &statsv, int connectivity = 8)
:param L: destitination Labeled image
:param I: the image to be labeled
:param connectivity: 8 or 4 for 8-way or 4-way connectivity respectively
:param statsv: statistics for each label, including the background label
Statistics information such as bounding box, area, and centroid is exported via the ``ConnectComponentStats`` structure defined as: ::
class CV_EXPORTS ConnectedComponentStats
{
public:
//! lower left corner column
int lower_x;
//! lower left corner row
int lower_y;
//! upper right corner column
int upper_x;
//! upper right corner row
int upper_y;
//! centroid column
double centroid_x;
//! centroid row
double centroid_y;
//! sum of all columns where the image was non-zero
uint64 integral_x;
//! sum of all rows where the image was non-zero
uint64 integral_y;
//! count of all non-zero pixels
unsigned int area;
};
findContours findContours
---------------- ----------------

@ -1091,24 +1091,24 @@ enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF
CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ, CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ,
OutputArray result, int method ); OutputArray result, int method );
struct CV_EXPORTS ConnectedComponentStats struct CV_EXPORTS ConnectedComponentStats
{ {
int32_t lower_x; int lower_x;//!< lower left corner column
int32_t lower_y; int lower_y;//!< lower left corner row
int32_t upper_x; int upper_x;//!< upper right corner column
int32_t upper_y; int upper_y;//!< upper right corner row
double centroid_x; double centroid_x;//!< centroid column
double centroid_y; double centroid_y;//!< centroid row
uint64_t integral_x; uint64 integral_x;//!< sum of all columns where the image was non-zero
uint64_t integral_y; uint64 integral_y;//!< sum of all rows where the image was non-zero
uint32_t area; unsigned int area;//!< count of all non-zero pixels
}; };
//! computes the connected components labeled image of boolean image I with 4 or 8 way connectivity - returns N, the total //! computes the connected components labeled image of boolean image I with 4 or 8 way connectivity - returns N, the total
//number of labels [0, N-1] where 0 represents the background label. L's value type determines the label type, an important //number of labels [0, N-1] where 0 represents the background label. L's value type determines the label type, an important
//consideration based on the total number of labels or alternatively the total number of pixels. //consideration based on the total number of labels or alternatively the total number of pixels.
CV_EXPORTS_W uint64_t connectedComponents(Mat &L, const Mat &I, int connectivity = 8); CV_EXPORTS_W uint64 connectedComponents(CV_OUT Mat &L, const Mat &I, int connectivity = 8);
CV_EXPORTS_W uint64_t connectedComponents(Mat &L, const Mat &I, std::vector<ConnectedComponentStats> &statsv, int connectivity = 8); CV_EXPORTS_W uint64 connectedComponentsWithStats(CV_OUT Mat &L, const Mat &I, CV_OUT std::vector<ConnectedComponentStats> &statsv, int connectivity = 8);
//! mode of the contour retrieval algorithm //! mode of the contour retrieval algorithm

@ -43,6 +43,16 @@
#include "precomp.hpp" #include "precomp.hpp"
#include <vector> #include <vector>
//It's 2012 and we still let compilers get by without defining standard integer types...
typedef schar int8_t;
typedef uchar uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
typedef int64 int64_t;
typedef uint64 uint64_t;
namespace cv{ namespace cv{
namespace connectedcomponents{ namespace connectedcomponents{
@ -463,7 +473,7 @@ uint64_t connectedComponents(Mat &L, const Mat &I, int connectivity){
} }
} }
uint64_t connectedComponents(Mat &L, const Mat &I, std::vector<ConnectedComponentStats> &statsv, int connectivity){ uint64_t connectedComponentsWithStats(Mat &L, const Mat &I, std::vector<ConnectedComponentStats> &statsv, int connectivity){
int lDepth = L.depth(); int lDepth = L.depth();
if(lDepth == CV_8U){ if(lDepth == CV_8U){
connectedcomponents::CCStatsOp<uint8_t> sop(statsv); return connectedComponents_sub1(L, I, connectivity, sop); connectedcomponents::CCStatsOp<uint8_t> sop(statsv); return connectedComponents_sub1(L, I, connectivity, sop);

@ -123,6 +123,7 @@ typedef Ptr<FeatureDetector> Ptr_FeatureDetector;
typedef Ptr<DescriptorExtractor> Ptr_DescriptorExtractor; typedef Ptr<DescriptorExtractor> Ptr_DescriptorExtractor;
typedef Ptr<Feature2D> Ptr_Feature2D; typedef Ptr<Feature2D> Ptr_Feature2D;
typedef Ptr<DescriptorMatcher> Ptr_DescriptorMatcher; typedef Ptr<DescriptorMatcher> Ptr_DescriptorMatcher;
typedef vector<ConnectedComponentStats> vector_ConnectedComponentStats;
typedef SimpleBlobDetector::Params SimpleBlobDetector_Params; typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
@ -410,7 +411,7 @@ static bool pyopencv_to(PyObject* obj, bool& value, const char* name = "<unknown
static PyObject* pyopencv_from(size_t value) static PyObject* pyopencv_from(size_t value)
{ {
return PyLong_FromUnsignedLong((unsigned long)value); return PyLong_FromSize_t(value);
} }
static bool pyopencv_to(PyObject* obj, size_t& value, const char* name = "<unknown>") static bool pyopencv_to(PyObject* obj, size_t& value, const char* name = "<unknown>")
@ -497,9 +498,16 @@ static bool pyopencv_to(PyObject* obj, float& value, const char* name = "<unknow
static PyObject* pyopencv_from(int64 value) static PyObject* pyopencv_from(int64 value)
{ {
return PyFloat_FromDouble((double)value); return PyLong_FromLongLong(value);
} }
#if !defined(__LP64__)
static PyObject* pyopencv_from(uint64 value)
{
return PyLong_FromUnsignedLongLong(value);
}
#endif
static PyObject* pyopencv_from(const string& value) static PyObject* pyopencv_from(const string& value)
{ {
return PyString_FromString(value.empty() ? "" : value.c_str()); return PyString_FromString(value.empty() ? "" : value.c_str());

Loading…
Cancel
Save