connectedcomponents: use opencv integral types, add to docs, fix up things for a python export
This commit is contained in:
@@ -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());
|
||||||
|
Reference in New Issue
Block a user