Skip to content

Commit 94f9f5a

Browse files
committed
Removed unused nodes.
Add Structuring element for morphological operations Modify Dilate and Erode nodes for support structuring elements.
1 parent 8b51384 commit 94f9f5a

File tree

13 files changed

+207
-245
lines changed

13 files changed

+207
-245
lines changed

source/blender/blenkernel/BKE_node.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,8 +586,6 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
586586
#define CMP_NODE_LENSDIST 303
587587

588588
#define CMP_NODE_CVPOINT 801
589-
#define CMP_NODE_IMAGE2CVIMAGE 802
590-
#define CMP_NODE_CVIMAGE2IMAGE 803
591589
#define CMP_NODE_CVCVTCOLOR 804
592590
#define CMP_NODE_CVCANNY 805
593591
#define CMP_NODE_CVNOT 806
@@ -643,6 +641,8 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
643641
#define CMP_NODE_CVPUTTEXT 853
644642
#define CMP_NODE_CVRECTANGLE 854
645643

644+
#define CMP_NODE_CVGETSTRUCTURINGELEMENT 854
645+
646646
/* channel toggles */
647647
#define CMP_CHAN_RGB 1
648648
#define CMP_CHAN_A 2

source/blender/blenkernel/intern/node.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1859,7 +1859,6 @@ static void registerCompositNodes(ListBase *ntypelist)
18591859
register_node_type_cmp_cvgravitycenter(ntypelist);
18601860
register_node_type_cmp_cvharris(ntypelist);
18611861
register_node_type_cmp_cvhough(ntypelist);
1862-
register_node_type_cmp_cvimage2image(ntypelist);
18631862
register_node_type_cmp_cvlaplace(ntypelist);
18641863
register_node_type_cmp_cvmult(ntypelist);
18651864
register_node_type_cmp_cvnegative(ntypelist);
@@ -1872,7 +1871,8 @@ static void registerCompositNodes(ListBase *ntypelist)
18721871
register_node_type_cmp_cvsub(ntypelist);
18731872
register_node_type_cmp_cvthreshold(ntypelist);
18741873
register_node_type_cmp_cvxor(ntypelist);
1875-
register_node_type_cmp_image2cvimage(ntypelist);
1874+
register_node_type_cmp_getStructuringElement(ntypelist);
1875+
18761876
}
18771877

18781878
static void registerShaderNodes(ListBase *ntypelist)

source/blender/editors/space_node/drawnode.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,6 +1692,11 @@ static void node_composit_buts_cvcvtcolor(uiLayout *layout, bContext *UNUSED(C),
16921692
uiItemR(layout, ptr, "cvcvtcolor_type", 0, "", ICON_NONE);
16931693
}
16941694

1695+
static void node_composit_buts_cvgetstructuringelement(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
1696+
{
1697+
uiItemR(layout, ptr, "cvgetstructuringelement_type", 0, "", ICON_NONE);
1698+
}
1699+
16951700
/* only once called */
16961701
static void node_composit_set_butfunc(bNodeType *ntype)
16971702
{
@@ -1851,6 +1856,9 @@ static void node_composit_set_butfunc(bNodeType *ntype)
18511856
case CMP_NODE_CVCVTCOLOR:
18521857
ntype->uifunc=node_composit_buts_cvcvtcolor;
18531858
break;
1859+
case CMP_NODE_CVGETSTRUCTURINGELEMENT:
1860+
ntype->uifunc=node_composit_buts_cvgetstructuringelement;
1861+
break;
18541862
}
18551863
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
18561864

source/blender/makesrna/RNA_access.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ extern StructRNA RNA_CompositorNodeZcombine;
175175
extern StructRNA RNA_CompositorNodeCvThreshold;
176176
extern StructRNA RNA_CompositorNodeCvCanny;
177177
extern StructRNA RNA_CompositorNodeCvCvtColor;
178+
extern StructRNA RNA_CompositorNodeCvGetStructuringelement;
178179

179180
extern StructRNA RNA_ConsoleLine;
180181
extern StructRNA RNA_Constraint;

source/blender/makesrna/intern/rna_nodetree.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2483,6 +2483,22 @@ static void def_cmp_bocv_cvtcolor(StructRNA *srna)
24832483
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
24842484
}
24852485

2486+
static void def_cmp_bocv_getstructuringelement(StructRNA *srna)
2487+
{
2488+
PropertyRNA *prop;
2489+
static EnumPropertyItem shape_items[] = {
2490+
{0, "RECT", 0, "Rect", ""},
2491+
{1, "CROSS", 0, "Cross", ""},
2492+
{2, "ELLIPSE", 0, "Ellipse", ""},
2493+
{0, NULL, 0, NULL, NULL}};
2494+
2495+
prop = RNA_def_property(srna, "cvgetstructuringelement_type", PROP_ENUM, PROP_NONE);
2496+
RNA_def_property_enum_sdna(prop, NULL, "custom1");
2497+
RNA_def_property_enum_items(prop, shape_items);
2498+
RNA_def_property_ui_text(prop, "Type", "Shape element");
2499+
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
2500+
2501+
}
24862502
/* -- Texture Nodes --------------------------------------------------------- */
24872503

24882504
static void def_tex_output(StructRNA *srna)

source/blender/makesrna/intern/rna_nodetree_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ DefNode( CompositorNode, CMP_NODE_HUECORRECT, def_cmp_huecorrect, "HUECO
123123
DefNode( CompositorNode, CMP_NODE_CVTHRESHOLD, def_cmp_bocv_threshold, "CVTHRESHOLD", CvThreshold, "OpenCV - Threshold", "" )
124124
DefNode( CompositorNode, CMP_NODE_CVCANNY, def_cmp_bocv_canny, "CVCANNY", CvCanny, "OpenCV - Canny", "" )
125125
DefNode( CompositorNode, CMP_NODE_CVCVTCOLOR, def_cmp_bocv_cvtcolor, "CVCVTCOLOR", CvColor, "OpenCV - Convert color", "" )
126+
DefNode( CompositorNode, CMP_NODE_CVGETSTRUCTURINGELEMENT, def_cmp_bocv_getstructuringelement, "CVGETSTRUCTURINGELEMENT", CvGetStructuringElement, "OpenCV - Get Structuring element", "" )
126127

127128
DefNode( TextureNode, TEX_NODE_OUTPUT, def_tex_output, "OUTPUT", Output, "Output", "" )
128129
DefNode( TextureNode, TEX_NODE_CHECKER, 0, "CHECKER", Checker, "Checker", "" )

source/blender/nodes/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ set(SRC
116116
composite/nodes/OpenCV/CMP_CvGravityCenter.c
117117
composite/nodes/OpenCV/CMP_CvHarris.c
118118
composite/nodes/OpenCV/CMP_CvHough.c
119-
composite/nodes/OpenCV/CMP_CvImage2image.c
120119
composite/nodes/OpenCV/CMP_CvLaplace.c
121120
composite/nodes/OpenCV/CMP_CvMult.c
122121
composite/nodes/OpenCV/CMP_CvNegative.c
@@ -129,7 +128,7 @@ set(SRC
129128
composite/nodes/OpenCV/CMP_CvSub.c
130129
composite/nodes/OpenCV/CMP_CvThreshold.c
131130
composite/nodes/OpenCV/CMP_CvXor.c
132-
composite/nodes/OpenCV/CMP_image2CvImage.c
131+
composite/nodes/OpenCV/CMP_GetStructuringElement.c
133132
composite/BOCV_util.c
134133

135134
shader/nodes/node_shader_camera.c

source/blender/nodes/NOD_composite.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ void register_node_type_cmp_cverode(ListBase *lb);
132132
void register_node_type_cmp_cvgravitycenter(ListBase *lb);
133133
void register_node_type_cmp_cvharris(ListBase *lb);
134134
void register_node_type_cmp_cvhough(ListBase *lb);
135-
void register_node_type_cmp_cvimage2image(ListBase *lb);
136135
void register_node_type_cmp_cvlaplace(ListBase *lb);
137136
void register_node_type_cmp_cvmult(ListBase *lb);
138137
void register_node_type_cmp_cvnegative(ListBase *lb);
@@ -145,6 +144,6 @@ void register_node_type_cmp_cvsobel(ListBase *lb);
145144
void register_node_type_cmp_cvsub(ListBase *lb);
146145
void register_node_type_cmp_cvthreshold(ListBase *lb);
147146
void register_node_type_cmp_cvxor(ListBase *lb);
148-
void register_node_type_cmp_image2cvimage(ListBase *lb);
147+
void register_node_type_cmp_getStructuringElement(ListBase *lb);
149148

150149
#endif

source/blender/nodes/composite/nodes/OpenCV/CMP_CvDilate.c

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -31,51 +31,66 @@
3131
#include "../../BOCV_util.h"
3232

3333

34-
static bNodeSocketTemplate cmp_node_cvDilate_in[]= {
35-
{ SOCK_OCV_IMAGE, 1, "cvImage", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
36-
{ SOCK_FLOAT, 1, "Iterations", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 15.0f},
37-
{ -1, 0, "" }
34+
static bNodeSocketTemplate cmp_node_cvDilate_in[] = {
35+
{ SOCK_RGBA, 1, "cvImage", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
36+
{ SOCK_INT, 1, "Iterations", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 15.0f},
37+
{ SOCK_FLOAT, 1, "Structuring element", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 15.0f},
38+
{ -1, 0, ""}
3839
};
39-
static bNodeSocketTemplate cmp_node_cvDilate_out[]= {
40-
{ SOCK_OCV_IMAGE, 0, "cvImage", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
41-
{ -1, 0, "" }
40+
static bNodeSocketTemplate cmp_node_cvDilate_out[] = {
41+
{ SOCK_RGBA, 0, "cvImage", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
42+
{ -1, 0, ""}
4243
};
4344

44-
static void node_composit_exec_cvDilate(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
45-
{
46-
int iterations;
47-
IplImage *image, *dst;
48-
CV_FUNCNAME( "cvDilate" );
49-
//TODO: Use atach buffers
50-
if(out[0]->hasoutput==0) return;
51-
52-
cvSetErrMode(1); //Parent mode error
53-
__CV_BEGIN__;
45+
static void node_composit_exec_cvDilate(void *data, bNode *node, bNodeStack **in, bNodeStack **out) {
46+
int iterations;
47+
IplImage *image, *dst;
48+
IplConvKernel *kernel;
49+
CompBuf* dst_buf;
50+
int *valuesKernel, i;
51+
52+
if (out[0]->hasoutput == 0) return;
53+
54+
if (in[0]->data) {
55+
56+
image = BOCV_IplImage_attach(in[0]->data);
57+
dst_buf = alloc_compbuf(image->width, image->height, image->nChannels, 1);
58+
dst = BOCV_IplImage_attach(dst_buf);
59+
iterations = (int) in[1]->vec[0];
60+
if (in[2]->data) {
61+
CompBuf* kernel_buf= in[2]->data;
62+
valuesKernel= malloc(kernel_buf->x*kernel_buf->y * sizeof(int));
63+
//Convert kernel to float array buf to send via socket
64+
for(i=0; i< kernel_buf->x*kernel_buf->y; i++){
65+
valuesKernel[i]= (int)kernel_buf->rect[i];
66+
}
67+
kernel= cvCreateStructuringElementEx(
68+
kernel_buf->x,
69+
kernel_buf->y,
70+
kernel_buf->x/2,
71+
kernel_buf->y/2,
72+
CV_SHAPE_CUSTOM,
73+
valuesKernel );
74+
cvDilate(image, dst, kernel, iterations);
75+
}else
76+
cvDilate(image, dst, 0, iterations);
77+
out[0]->data = dst_buf;
78+
79+
BOCV_IplImage_detach(dst);
80+
BOCV_IplImage_detach(image);
81+
}
5482

55-
CV_CALL(image = in[0]->data);
56-
dst= cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
57-
CV_CALL(iterations=(int)in[1]->vec[0]);
58-
if(image->nChannels>1)
59-
CV_ERROR(CV_BadNumChannels,"The number of channels of the source image isn't 1" );
60-
61-
if(in[0]->data){
62-
CV_CALL(cvDilate(image,dst,0,iterations));
63-
out[0]->data= dst;
64-
}
65-
__CV_END__;
6683
}
6784

85+
void register_node_type_cmp_cvdilate(ListBase *lb) {
86+
static bNodeType ntype;
87+
88+
node_type_base(&ntype, CMP_NODE_CVDILATE, "OpenCV - Dilate", NODE_CLASS_OCV_IMAGEPROCESS, NODE_OPTIONS);
89+
node_type_socket_templates(&ntype, cmp_node_cvDilate_in, cmp_node_cvDilate_out);
90+
node_type_size(&ntype, 150, 80, 250);
91+
node_type_exec(&ntype, node_composit_exec_cvDilate);
6892

69-
void register_node_type_cmp_cvdilate(ListBase *lb)
70-
{
71-
static bNodeType ntype;
72-
73-
node_type_base(&ntype, CMP_NODE_CVDILATE, "OpenCV - Dilate", NODE_CLASS_OCV_IMAGEPROCESS, NODE_OPTIONS);
74-
node_type_socket_templates(&ntype,cmp_node_cvDilate_in, cmp_node_cvDilate_out);
75-
node_type_size(&ntype, 150, 80, 250);
76-
node_type_exec(&ntype, node_composit_exec_cvDilate);
77-
78-
nodeRegisterType(lb, &ntype);
93+
nodeRegisterType(lb, &ntype);
7994
}
8095

8196

source/blender/nodes/composite/nodes/OpenCV/CMP_CvErode.c

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,35 +32,54 @@
3232

3333

3434
static bNodeSocketTemplate cmp_node_cvErode_in[]= {
35-
{ SOCK_OCV_IMAGE, 1, "Image", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
35+
{ SOCK_RGBA, 1, "Image", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
3636
{ SOCK_INT, 1, "Iterations", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 15.0f},
37-
{ -1, 0, "" }
37+
{ SOCK_FLOAT, 1, "Structuring element", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 15.0f},
38+
{ -1, 0, "" }
3839
};
3940
static bNodeSocketTemplate cmp_node_cvErode_out[]= {
40-
{ SOCK_OCV_IMAGE, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
41+
{ SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
4142
{ -1, 0, "" }
4243
};
4344

4445
static void node_composit_exec_cvErode(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
4546
{
46-
int iterations;
47-
IplImage *src, *dst;
48-
CompBuf *dst_buf;
49-
50-
if(in[0]->hasinput==0) return;
51-
if(out[0]->hasoutput==0) return;
52-
53-
src= BOCV_IplImage_attach(in[0]->data);
54-
dst_buf = dupalloc_compbuf(in[0]->data);
55-
iterations=(int)in[1]->vec[0];
56-
dst = BOCV_IplImage_attach(dst_buf);
57-
58-
cvErode(src,dst,0,iterations);
47+
int iterations;
48+
IplImage *image, *dst;
49+
IplConvKernel *kernel;
50+
CompBuf* dst_buf;
51+
int *valuesKernel, i;
52+
53+
if (out[0]->hasoutput == 0) return;
5954

60-
out[0]->data = dst_buf;
55+
if (in[0]->data) {
6156

62-
BOCV_IplImage_detach(src);
63-
BOCV_IplImage_detach(dst);
57+
image = BOCV_IplImage_attach(in[0]->data);
58+
dst_buf = alloc_compbuf(image->width, image->height, image->nChannels, 1);
59+
dst = BOCV_IplImage_attach(dst_buf);
60+
iterations = (int) in[1]->vec[0];
61+
if (in[2]->data) {
62+
CompBuf* kernel_buf= in[2]->data;
63+
valuesKernel= malloc(kernel_buf->x*kernel_buf->y * sizeof(int));
64+
//Convert kernel to float array buf to send via socket
65+
for(i=0; i< kernel_buf->x*kernel_buf->y; i++){
66+
valuesKernel[i]= (int)kernel_buf->rect[i];
67+
}
68+
kernel= cvCreateStructuringElementEx(
69+
kernel_buf->x,
70+
kernel_buf->y,
71+
kernel_buf->x/2,
72+
kernel_buf->y/2,
73+
CV_SHAPE_CUSTOM,
74+
valuesKernel );
75+
cvErode(image, dst, kernel, iterations);
76+
}else
77+
cvErode(image, dst, 0, iterations);
78+
out[0]->data = dst_buf;
79+
80+
BOCV_IplImage_detach(dst);
81+
BOCV_IplImage_detach(image);
82+
}
6483

6584

6685
}

0 commit comments

Comments
 (0)