c++ 一个h文件里面定义一个主类,然后定义多个子类
最近遇到一个函数,在调用的时候出现问题,记录下实现过程。
#ifndef MLS_DEFORMATION_H
#define MLS_DEFORMATION_H #include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp> using namespace cv;
using namespace std; class MLSDeformation//父类
{
public:
virtual bool InitMLSD(const cv::Mat& oriImg,const std::vector<cv::Point2i>&src_pt,int alpha=, int gridsize=);//定义成虚函数是为了方便子类改写
virtual cv::Mat Deformation(const std::vector<cv::Point2i> &dst_pt)=;//=0说明这个函数没有实现完
explicit MLSDeformation();// 指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用。
virtual ~MLSDeformation();
protected:
cv::Mat getDeformationImg();
void meanMat(cv::Mat& mat, int i, int j);//对mat(i,j)进行gridsize的中值(当mean为空时),不包括像素为空的坐标
void repairMat(cv::Mat& mat);//变形后的mat有些位置没有像素点,使用中值滤波填补
int gridsize_;
int alpha_;///weight_计算相关
int n_point_;///控制点数
cv::Mat src_img_;//原图像
int src_width_;
int src_height_;
std::vector<cv::Point2d> pi_point_;//原控制点
std::vector<cv::Point2d> qi_point_;//变形后的控制点
///参数信息
double*weight_;//权重w*h*pt
double*sum_weight_;//w*h
cv::Point2d*deformation_pt_;//对应目标坐标
cv::Point2d pstart_, qstart_;
std::vector<cv::Point2d> pdiff_, qdiff_;
}; class MLSDAffine :public MLSDeformation//继承主类的子类
{
public:
virtual bool InitMLSD(const cv::Mat& oriImg,const std::vector<cv::Point2i>&src_pt,int alpha=, int gridsize=);//写成virtual完全是因为从主类拷贝过来的,也可以认为方便接下来的子类继承他
virtual cv::Mat Deformation(const std::vector<cv::Point2i> &dst_pt);
explicit MLSDAffine();
virtual~MLSDAffine();
private:
double*a_affine_;///affine A参数
}; class MLSDSimilarity :public MLSDeformation
{
public:
virtual bool InitMLSD(const cv::Mat& oriImg,const std::vector<cv::Point2i>&src_pt,int alpha=, int gridsize=);
virtual cv::Mat Deformation(const std::vector<cv::Point2i> &dst_pt);
explicit MLSDSimilarity();
virtual~MLSDSimilarity();
private:
double*us_;//us参数
cv::Matx22d*a_similarity_;///similarity A参数
}; class MLSDRigid :public MLSDeformation
{
public:
virtual bool InitMLSD(const cv::Mat& oriImg,const std::vector<cv::Point2i>&src_pt,int alpha=, int gridsize=);
virtual cv::Mat Deformation(const std::vector<cv::Point2i> &dst_pt);
explicit MLSDRigid();
virtual~MLSDRigid();
private:
double*ur_;//us参数
cv::Point2d*pstart_rigid_;//
cv::Matx22d*a_rigid_;///similarity A参数
};
#endif // MLS_DEFORMATION_H
从上面的实现可以看出,实现了一个MLS变形的方法,里面有两个函数,分别是init和deformation,然后三个子类开始继承这个父类,然后分别实现了MLS的仿射变换,相似变换,刚性变化。
这里顺便扩展下几个变换的意义。
仿射变换:主要包括平移变换、旋转变换、缩放变换(也叫尺度变换)、倾斜变换(也叫错切变换、剪切变换、偏移变换)、翻转变换,有六个自由度。
仿射变换保持二维图形的“平直性”和“平行性”,但是角度会改变。
“平直性”:变换后直线还是直线、圆弧还是圆弧。
“平行性”:平行线还是平行线,直线上点的位置顺序不变
相似变换:相当于是等距变换和均匀缩放的一个复合,用S表示变换矩阵,即为

左上角2×2矩阵为旋转部分,tx和ty为平移因子,它有4个自由度,即旋转,x方向平移,y方向平移和缩放因子s。相似变换前后长度比,夹角,虚圆点I,J保持不变。相似变换其实与相似三角形之间是有类似的。
在调用这些方法的时候,主要可以有以下几种方式。
刚性变换:只有物体的位置(平移变换)和朝向(旋转变换)发生改变,而形状不变。
调用上述类的方法:
第一,直接调用子类:
MLSDRigid mlsr;
mlsr.InitMLSD(<#const cv::Mat &oriImg#>, <#const std::vector<cv::Point2i> &src_pt#>);
第二,调用父类,然后指针操作
MLSDeformation *mls;
mls = new MLSDAffine;
mls->InitMLSD(src,src_pt,alpha, gridsize);
甚至可以写成switch case语句,不同的条件下,mls new不同的子类,然后调用他的method。
c++ 一个h文件里面定义一个主类,然后定义多个子类的更多相关文章
- fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。
为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...
- 一个Java文件至多包含一个公共类
编写一个java源文件时,该源文件又称为编译单元.一个java文件可以包含多个类,但至多包含一个公共类,作为编译时该java文件的公用接口,公共类的名字和源文件的名字要相同,源文件名字的格式为[公共类 ...
- PyCharm在同一个包(package)下,如何把一个.py文件导入另外一个.py文件下
PyCharm在同一个包(package)下,如何把一个.py文件导入另外一个.py文件下 在同一个包下只需要用import 掉以后就可以找到模块所在的位置,但是如果不在同一个包下,在需要返回父级调用 ...
- Java中主类中定义方法加static和不加static的区别
Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用(类名.方法),后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 ...
- 解决Android studio生成H文件时报找不到类文件错误
今天整理思路时觉得在native直接调用java的方法显示这个办法挺不错 于是就用到了生成H文件 可能我的编译环境和他们的不一样 网上的教程如下 javah -d ../jni com.jm.prom ...
- 编辑一个.bat文件来启动一个.erl的程序?
新建文本输入:"D:\DY\erl\erl5.10.2\bin\erl.exe" -noshell -s convert get_request 保存为xx.bat.. 解释: ...
- Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用,后者必须先实例化后用实例调用)
package lsg.ap.april4th2; /* 知识点:1.Getter and Setter 的应用 2.局部变量与成员变量(也可叫做全局变量) 3.Static关键字的用法 a.成员变量 ...
- 定义类Human,具有若干属性和功能;定义其子类Man、Woman; 在主类Test中分别创建子类、父类和上转型对象,并测试其特性。
package com.hanqi.test; public class Humen { private String speak; private String read; private Stri ...
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...
随机推荐
- Java内存管理-初始JVM和JVM启动流程(二)
勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了什么是程序,以及Java程序运行的三个阶段.也顺便提到了Java中比较重要 ...
- ASP.net MVC把Html Table导出Excel
[HttpPost] public ActionResult ExportExcel(FormCollection form) { string strHtml = form["hHtml& ...
- linux golang开发环境配置(离线方式)
<获取开发工具> 到https://www.golangtc.com/download 下载安装包, 根据自己的系统选择合适的开发包,这里选择go.1.9.2.linux-amd6 ...
- Flask信号源码流程
1. appcontext_pushed = _signals.signal('appcontext-pushed'# 请求app上下文push时执行 return RequestContext(se ...
- C# 格式化新招
C# 格式化新招 ) from Attribute_Item where AttributeSysNo=$AttributeSysNo and Name='$Name' and SysNo !=$Sy ...
- 基于Material-Design的Gank-IO客户端
title: 基于Material Design的Gank IO客户端 date: 2017-03-13 12:58:03 tags: - Android - Material Design - Rx ...
- AngularJS中的ng-controller是什么东东
在AngularJS中,ng-controller是最常用的directive.比如: var app = angular.module("app",[]); app.contro ...
- 解决IE9下交通银行网上银行无法输入密码的问题
自系统升级到 Win 7以后,突然发现用 IE9 浏览器登陆交通银行网上银行时,始终不能正常 输入密码.原来,非要进行特别的设置才可.现记录如下: 1.没有交通银行安装安全输入控件,安装即可. 当 ...
- 通过ZwQuerySystemInformation获取EPROCESS
google一下,发现很多都是直接通过ZwQuerySystemInformation通过11号获取进程结构SYSTEM_PROCESS_INFORMATION,对于详细的进程信息表达不够.所以想要通 ...
- android: 使用本地广播
前面我们发送和接收的广播全部都是属于系统全局广播,即发出的广播可以被其他任何 的任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播.这样就很容 易会引起安全性的问题,比如说我们发送的一 ...