summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2013-08-30 12:59:04 +0100
committerTim Redfern <tim@eclectronics.org>2013-08-30 12:59:04 +0100
commitf38cdcf952ac5c631ed285282e1bc2943f199101 (patch)
tree7a511dc3acc41691bdf346933c09b57230cd6bcd
parent949a501117d17ec29e29e63dfbab33f3d933c75e (diff)
still image loader
-rw-r--r--rotord/src/nodes_transform.h92
1 files changed, 8 insertions, 84 deletions
diff --git a/rotord/src/nodes_transform.h b/rotord/src/nodes_transform.h
index 69a0af6..bb3a04f 100644
--- a/rotord/src/nodes_transform.h
+++ b/rotord/src/nodes_transform.h
@@ -32,6 +32,11 @@ namespace Rotor {
};
Image *transform(Image *in){
if (in){
+ //INTER_NEAREST - a nearest-neighbor interpolation
+ //INTER_LINEAR - a bilinear interpolation (used by default)
+ //INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
+ //INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
+ //INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood
int filtmode;
switch(attributes["filter"]->intVal){
case TRANSFORM_nearest:
@@ -83,7 +88,7 @@ namespace Rotor {
// Compute rotation matrix
//
- cv::Point centre = cv::Point( oX*in->w, oY*in->h );
+ cv::Point centre = cv::Point( oX*image.w, oY*image.h );
rot_mat = getRotationMatrix2D( centre, r, s );
// Do the transformation
@@ -92,12 +97,6 @@ namespace Rotor {
warpAffine( inter.rgb, image.rgb, rot_mat, image.rgb.size(), filtmode, cv::BORDER_WRAP);
//BORDER_WRAP
- //INTER_NEAREST - a nearest-neighbor interpolation
- //INTER_LINEAR - a bilinear interpolation (used by default)
- //INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- //INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
- //INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood
-
return &image;
}
return nullptr;
@@ -122,16 +121,9 @@ namespace Rotor {
}
private:
};
- class Still_image: public Image_node {
+ class Still_image: public Transformer {
public:
Still_image(){
- create_parameter("transformX","number","X transformation","Transform X",0.0f);
- create_parameter("transformY","number","Y transformation","Transform X",0.0f);
- create_parameter("originX","number","X transformation origin","Origin X",0.5f);
- create_parameter("originY","number","Y transformation origin","Origin Y",0.5f);
- create_parameter("rotation","number","Rotation about origin","Rotation",0.0f);
- create_parameter("scale","number","Scale about origin","Scale",1.0f);
- create_attribute("filter","Filtering mode","Filter mode","linear",{"nearest","linear","area","cubic","lanczos"});
create_attribute("filename","name of image file to load","File name","");
title="Still image";
description="Load a still image and apply 2D transformation";
@@ -151,75 +143,7 @@ namespace Rotor {
Still_image* clone(map<string,string> &_settings) { return new Still_image(_settings);};
Image *output(const Frame_spec &frame){
if (!still.rgb.empty()){
- int filtmode;
- switch(attributes["filter"]->intVal){
- case TRANSFORM_nearest:
- filtmode=cv::INTER_NEAREST;
- break;
- case TRANSFORM_linear:
- filtmode=cv::INTER_LINEAR;
- break;
- case TRANSFORM_area:
- filtmode=cv::INTER_AREA;
- break;
- case TRANSFORM_cubic:
- filtmode=cv::INTER_CUBIC;
- break;
- case TRANSFORM_lanczos:
- filtmode=cv::INTER_LANCZOS4;
- break;
- }
-
- float tX=parameters["transformX"]->value;
- float tY=parameters["transformY"]->value;
- float oX=parameters["originX"]->value;
- float oY=parameters["originY"]->value;
- float r=parameters["rotation"]->value;
- float s=parameters["scale"]->value;
-
- cerr<<"still: xform "<<tX<<","<<tY<<" rotate "<<r<<", scale "<<s<<" from "<<oX<<","<<oY<<endl;
-
- //do opencv transform
- cv::Point2f srcTri[3], dstTri[3];
- cv::Mat rot_mat(2,3,CV_32FC1);
- cv::Mat trans_mat(2,3,CV_32FC1);
-
- Image inter;
- inter.setup(still.w,still.h);
- // Compute matrix by creating triangle and transforming
- //is there a better way - combine the 2? Just a bit of geometry
- srcTri[0].x=0;
- srcTri[0].y=0;
- srcTri[1].x=still.w-1;
- srcTri[1].y=0;
- srcTri[2].x=0;
- srcTri[2].y=still.h-1;
- for (int i=0;i<3;i++){
- dstTri[i].x=srcTri[i].x+(tX*still.w);
- dstTri[i].y=srcTri[i].y+(tY*still.h);
- }
- trans_mat=getAffineTransform( srcTri, dstTri );
- warpAffine( still.rgb, inter.rgb, trans_mat, inter.rgb.size(), filtmode, cv::BORDER_WRAP);
-
-
- // Compute rotation matrix
- //
- cv::Point centre = cv::Point( oX*inter.w, oY*inter.h );
-
- rot_mat = getRotationMatrix2D( centre, r, s );
- // Do the transformation
- //
-
- warpAffine( inter.rgb, image.rgb, rot_mat, image.rgb.size(), filtmode, cv::BORDER_WRAP);
- //BORDER_WRAP
-
- //INTER_NEAREST - a nearest-neighbor interpolation
- //INTER_LINEAR - a bilinear interpolation (used by default)
- //INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- //INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
- //INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood
-
- return &image;
+ return transform(&still);
}
else return nullptr;
}