⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagedraw.h

📁 一个语言识别引擎
💻 H
字号:
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-

/*
 * Copyright (C) 2006 Paul Fitzpatrick
 * CopyPolicy: Released under the terms of the GNU GPL v2.0.
 *
 */

#ifndef _YARP2_IMAGEDRAW_
#define _YARP2_IMAGEDRAW_

#include <math.h>

#include <yarp/sig/Image.h>

#ifndef M_PI
#define M_PI 3.1415926535897932
#endif

namespace yarp {
    namespace sig{
        /**
         * \ingroup sig_class
         *
         *  Very basic drawing functions, in case you don't have 
         *  anything better available.
         */
        namespace draw {

            template <class T>
            void addSegment(ImageOf<T>& dest, const T& pix, 
                            int x, int y, int dx, int dy) {
                const double vx = double(dx - x);
                const double vy = double(dy - y);
                const int steps = int(2*fmax(fabs(vx), fabs(vy)));
                const double r = 1.0 / steps;
                for (int i = 0; i <= steps; i++) {
                    dest.safePixel(int(x+vx*i*r),int(y+vy*i*r)) = pix;
                }
            }

            template <class T>
            void addCircle(ImageOf<T>& dest, const T& pix, 
                           int i, int j, int r) {
                float d, r2 = (float)(r*r);
                for (int ii=i-r; ii<=i+r; ii++) {
                    for (int jj=j-r; jj<=j+r; jj++) {
                        d = float((ii-i)*(ii-i)+(jj-j)*(jj-j));
                        if (d<=r2) {
                            dest.safePixel(ii,jj) = pix;
                        }
                    }
                }
            }

            template <class T>
            void addCrossHair(ImageOf<T>& dest, const T& pix, 
                              int i, int j, int r) {
                for (int ii=i-r; ii<=i+r; ii++) {
                    for (int jj=j-r; jj<=j+r; jj++) {
                        if (ii==i||jj==j) {
                            dest.safePixel(ii,jj) = pix;
                        }
                    }
                }
            }

            template <class T>
            void addCircleOutline(ImageOf<T>& dest, const T& pix, 
                                  int i, int j, int r) {
                float d, r2 = float(r*r), r2l = float((r-1.1)*(r-1.1));
                for (int ii=i-r; ii<=i+r; ii++) {
                    for (int jj=j-r; jj<=j+r; jj++) {
                        d = float((ii-i)*(ii-i)+(jj-j)*(jj-j));
                        if (d<=r2 && d>=r2l) {
                            dest.safePixel(ii,jj) = pix;
                        }
                    }
                }
            }

            template <class T>
            void addOvalOutline(ImageOf<T>& dest, const T& pix, 
                                int i, int j, int h2, int w2) {
                float x, y;
                for (float th=0; th<2*M_PI; th+=0.01) {
                    x = j+w2*cos(th);
                    y = i+h2*sin(th);
                    dest.safePixel((int)y,(int)x) = pix;
                }
            }


            template <class T>
            void addRectangleOutline(ImageOf<T>& dest, const T& pix, 
                                     int i, int j, int w, int h) {
                for (int ii=i-w; ii<=i+w; ii++) {
                    dest.safePixel(ii,j-h) = pix;
                    dest.safePixel(ii+1,j-h+1) = pix;
                    dest.safePixel(ii,j+h) = pix;
                    dest.safePixel(ii,j+h-1) = pix;
                }
                for (int jj=j-h; jj<=j+h; jj++) {
                    dest.safePixel(i-w,jj) = pix;
                    dest.safePixel(i-w+1,jj) = pix;
                    dest.safePixel(i+w,jj) = pix;
                    dest.safePixel(i+w-1,jj) = pix;
                }
            }

            /**
             * warning : i, j is x, y center of rectangle
             */
            template <class T>
            void addRectangle(ImageOf<T>& dest, const T& pix, 
                              int i, int j, int w, int h) {
                for (int ii=i-w; ii<=i+w; ii++) {
                    for (int jj=j-h; jj<=j+h; jj++) {
                        dest.safePixel(ii,jj) = pix;
                    }
                }
            }

            template <class T>
            int applyThreshold(ImageOf<T>& src, ImageOf<T>& dest, 
                               const T& thetalo, const T& thetahi,
                               const T& pix0, const T& pix1) {
                int h = src.height();
                int w = src.width();
                for (int i=0; i<h; i++) {
                    for (int j=0; j<w; j++) {
                        if (src(i,j)>=thetalo && src(i,j)<=thetahi) {
                            dest(i,j) = pix1;
                        } else {
                            dest(i,j) = pix0;
                        }
                    }
                }
                return 0;
            }

            template <class T>
            void setImagePixels(ImageOf<T>& src, const T& pix) {
                int h = src.height();
                int w = src.width();
                for (int i=0; i<h; i++) {
                    for (int j=0; j<w; j++) {
                        src(i,j) = pix;
                    }
                }  
            }

#ifndef IMGFOR
#define IMGFOR(img,i,j) for (int i=0; i<(img).width(); i++) for (int j=0; j<(img).height(); j++)
#endif

        }
    }
}  // end namespace yarp::sig::draw

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -