精华内容
下载资源
问答
  • VTK 多平面重建(MPR)及三维切片显示

    万次阅读 热门讨论 2017-12-14 21:11:06
    在此之前翻阅很资料,爬过很的坑,花费不少时间,终于还是完成了!虽然实现地很简单,但是大体功能是实现了。后面需要完善功能的话,可以用qt与vtk结合开发。 MPR MPR(multi-planner reformation)也称多平面重建...

    在此之前翻阅很多资料,爬过很多的坑,花费不少时间,终于还是完成了!虽然实现地很简单,但是大体功能是实现了。后面需要完善功能的话,可以用qt与vtk结合开发。

    MPR

    MPR(multi-planner reformation)也称多平面重建,多重面重建是将扫描范围内所有的轴位图像叠加起来再对某些标线标定的重组线所指定的组织进行冠状、矢状位、任意角度斜位图像重组。

    MPR 的优点
    能任意产生新的断层图像,而无需重复扫描。
    曲面重组能在一幅图像里展开显示弯曲物体的生长。
    MPR的缺点
    难以表达复杂的空间结构。
    曲面重组易造成假阳性。

    #include "vtkSmartPointer.h"
    #include "vtkActor.h"
    #include "vtkCamera.h"
    #include "vtkCellPicker.h"
    #include "vtkCommand.h"
    #include "vtkImageActor.h"
    #include "vtkImageReslice.h"
    #include "vtkInteractorStyleImage.h"
    #include "vtkImageMapToColors.h"
    #include "vtkImagePlaneWidget.h"
    #include "vtkImageReader.h"
    #include "vtkInteractorEventRecorder.h"
    #include "vtkLookupTable.h"
    #include "vtkOutlineFilter.h"
    #include "vtkDICOMImageReader.h"
    #include "vtkPolyDataMapper.h"
    #include "vtkProperty.h"
    #include "vtkRenderWindow.h"
    #include "vtkRenderWindowInteractor.h"
    #include "vtkRenderer.h"
    #include "vtkImageData.h"
    #include "vtkPointData.h"
    #include "vtkPlaneSource.h"
    #include "vtkPlane.h"
    #include "vtkResliceCursorActor.h"
    #include "vtkResliceCursorPolyDataAlgorithm.h"
    #include "vtkResliceCursor.h"
    #include "vtkResliceCursorWidget.h"
    #include "vtkResliceCursorLineRepresentation.h"
    #include "vtkBiDimensionalWidget.h"
    #include"vtkAutoInit.h"
    #include"vtkAxesActor.h"
    #include"vtkTransform.h"
    #include"vtkTextActor.h"
    #include"vtkProperty2D.h"
    
    VTK_MODULE_INIT(vtkRenderingOpenGL);
    VTK_MODULE_INIT(vtkInteractionStyle);
    VTK_MODULE_INIT(vtkRenderingFreeType);
    VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
    
    class vtkResliceCursorCallback : public vtkCommand
    {
    public:
        static vtkResliceCursorCallback *New()
        {
            return new vtkResliceCursorCallback;
        }
        void Execute(vtkObject *caller, unsigned long, void *callData) override
        {
            vtkImagePlaneWidget* ipw = dynamic_cast< vtkImagePlaneWidget* >(caller);
            if (ipw)
            {
                double* wl = static_cast<double*>(callData);
    
                if (ipw == this->IPW[0])
                {
                    this->IPW[1]->SetWindowLevel(wl[0], wl[1], 1);
                    this->IPW[2]->SetWindowLevel(wl[0], wl[1], 1);
                }
                else if (ipw == this->IPW[1])
                {
                    this->IPW[0]->SetWindowLevel(wl[0], wl[1], 1);
                    this->IPW[2]->SetWindowLevel(wl[0], wl[1], 1);
                }
                else if (ipw == this->IPW[2])
                {
                    this->IPW[0]->SetWindowLevel(wl[0], wl[1], 1);
                    this->IPW[1]->SetWindowLevel(wl[0], wl[1], 1);
                }
            }
            vtkResliceCursorWidget *rcw = dynamic_cast<vtkResliceCursorWidget * >(caller);
            if (rcw)
            {
                vtkResliceCursorLineRepresentation *rep = dynamic_cast<vtkResliceCursorLineRepresentation * >(rcw->GetRepresentation());
                vtkResliceCursor *rc = rep->GetResliceCursorActor()->GetCursorAlgorithm()->GetResliceCursor();
                for (int i = 0; i < 3; i++)
                {
                    vtkPlaneSource *ps = static_cast< vtkPlaneSource * >(this->IPW[i]->GetPolyDataAlgorithm());
                    ps->SetNormal(rc->GetPlane(i)->GetNormal());
                    ps->SetCenter(rc->GetPlane(i)->GetOrigin());
                    this->IPW[i]->UpdatePlacement();
                }
            }
            this->RCW[0]->Render();
        }
        vtkResliceCursorCallback() {}
        vtkImagePlaneWidget* IPW[3];
        vtkResliceCursorWidget *RCW[3];
    };
    
    int main()
    {
        vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
        reader->SetDirectoryName("F://CT3");
        reader->Update();
    
        /*vtkSmartPointer<vtkOutlineFilter> outline = vtkSmartPointer<vtkOutlineFilter>::New();
        outline->SetInputConnection(reader->GetOutputPort());*/
    
        vtkSmartPointer<vtkPolyDataMapper> outlineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        outlineMapper->SetInputConnection(reader->GetOutputPort());
    
        vtkSmartPointer<vtkActor> outlineActor = vtkSmartPointer<vtkActor>::New();
        outlineActor->SetMapper(outlineMapper);
    
        vtkSmartPointer<vtkRenderer> ren[4];
        vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
        renWin->SetMultiSamples(0);
    
        for (int i = 0; i < 4; i++)
        {
            ren[i] = vtkSmartPointer<vtkRenderer>::New();
            renWin->AddRenderer(ren[i]);
        }
    
        vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
        iren->SetRenderWindow(renWin);
    
        vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();
        picker->SetTolerance(0.005);
    
        vtkSmartPointer<vtkProperty> ipwProp = vtkSmartPointer<vtkProperty>::New();
    
        vtkSmartPointer<vtkImagePlaneWidget> planeWidget[3];
        int imageDims[3];
        reader->GetOutput()->GetDimensions(imageDims);
    
        for (int i = 0; i < 3; i++)
        {
            planeWidget[i] = vtkSmartPointer<vtkImagePlaneWidget>::New();
            planeWidget[i]->SetInteractor(iren);
            planeWidget[i]->SetPicker(picker);
            planeWidget[i]->RestrictPlaneToVolumeOn();
            double color[3] = { 0, 0, 0 };
            color[i] = 1;
            planeWidget[i]->GetPlaneProperty()->SetColor(color);
            planeWidget[i]->SetTexturePlaneProperty(ipwProp);
            planeWidget[i]->TextureInterpolateOff();
            planeWidget[i]->SetResliceInterpolateToLinear();
            planeWidget[i]->SetInputConnection(reader->GetOutputPort());
            planeWidget[i]->SetPlaneOrientation(i);
            planeWidget[i]->SetSliceIndex(imageDims[i] / 2);
            planeWidget[i]->DisplayTextOn();
            planeWidget[i]->SetDefaultRenderer(ren[3]);
            planeWidget[i]->SetWindowLevel(1358, -27);
            planeWidget[i]->On();
            planeWidget[i]->InteractionOn();
        }
    
        planeWidget[1]->SetLookupTable(planeWidget[0]->GetLookupTable());
        planeWidget[2]->SetLookupTable(planeWidget[0]->GetLookupTable());
    
        vtkSmartPointer<vtkResliceCursorCallback> cbk = vtkSmartPointer<vtkResliceCursorCallback>::New();
        vtkSmartPointer< vtkResliceCursor > resliceCursor = vtkSmartPointer< vtkResliceCursor >::New();
        resliceCursor->SetCenter(reader->GetOutput()->GetCenter());
        resliceCursor->SetThickMode(0);
        resliceCursor->SetThickness(10, 10, 10);
        resliceCursor->SetImage(reader->GetOutput());
    
        vtkSmartPointer< vtkResliceCursorWidget > resliceCursorWidget[3];
        vtkSmartPointer< vtkResliceCursorLineRepresentation > resliceCursorRep[3];
    
        double viewUp[3][3] = { { 0, 0, -1 }, { 0, 0, 1 }, { 0, 1, 0 } };
        for (int i = 0; i < 3; i++)
        {
            resliceCursorWidget[i] = vtkSmartPointer< vtkResliceCursorWidget >::New();
            resliceCursorWidget[i]->SetInteractor(iren);
    
            resliceCursorRep[i] = vtkSmartPointer< vtkResliceCursorLineRepresentation >::New();
            resliceCursorWidget[i]->SetRepresentation(resliceCursorRep[i]);
            resliceCursorRep[i]->GetResliceCursorActor()->GetCursorAlgorithm()->SetResliceCursor(resliceCursor);
            resliceCursorRep[i]->GetResliceCursorActor()->GetCursorAlgorithm()->SetReslicePlaneNormal(i);
    
            const double minVal = reader->GetOutput()->GetScalarRange()[0];
            if (vtkImageReslice *reslice = vtkImageReslice::SafeDownCast(resliceCursorRep[i]->GetReslice()))
            {
                reslice->SetBackgroundColor(minVal, minVal, minVal, minVal);
            }
    
            resliceCursorWidget[i]->SetDefaultRenderer(ren[i]);
            resliceCursorWidget[i]->SetEnabled(1);
    
            ren[i]->GetActiveCamera()->SetFocalPoint(0, 0, 0);
            double camPos[3] = { 0, 0, 0 };
            camPos[i] = 1;
            ren[i]->GetActiveCamera()->SetPosition(camPos);
            ren[i]->GetActiveCamera()->ParallelProjectionOn();
            ren[i]->GetActiveCamera()->SetViewUp(viewUp[i][0], viewUp[i][1], viewUp[i][2]);
            ren[i]->ResetCamera();
            cbk->IPW[i] = planeWidget[i];
            cbk->RCW[i] = resliceCursorWidget[i];
            resliceCursorWidget[i]->AddObserver(vtkResliceCursorWidget::ResliceAxesChangedEvent, cbk);
            double range[2];
            reader->GetOutput()->GetScalarRange(range);
            resliceCursorRep[i]->SetWindowLevel(range[1] - range[0], (range[0] + range[1]) / 2.0);
            planeWidget[i]->SetWindowLevel(range[1] - range[0], (range[0] + range[1]) / 2.0);
            resliceCursorRep[i]->SetLookupTable(resliceCursorRep[0]->GetLookupTable());
            planeWidget[i]->GetColorMap()->SetLookupTable(resliceCursorRep[0]->GetLookupTable());
        }
    
        /*vtkSmartPointer<vtkTextActor> textActor = vtkSmartPointer<vtkTextActor>::New();
        textActor->SetInput("横断面");
        textActor->GetProperty()->SetColor(0.0,1.0,0.0);*/
    
    
        ren[0]->SetBackground(0.3, 0.1, 0.1);
        ren[1]->SetBackground(0.1, 0.3, 0.1);
        ren[2]->SetBackground(0.1, 0.1, 0.3);
        ren[3]->AddActor(outlineActor);
        ren[3]->SetBackground(0.1, 0.1, 0.1);
        renWin->SetSize(600, 600);
    
        ren[0]->SetViewport(0, 0, 0.5, 0.5);
        ren[1]->SetViewport(0.5, 0, 1, 0.5);
        ren[2]->SetViewport(0, 0.5, 0.5, 1);
        ren[3]->SetViewport(0.5, 0.5, 1, 1);
        renWin->Render();
    
        ren[3]->GetActiveCamera()->Elevation(110);
        ren[3]->GetActiveCamera()->SetViewUp(0, 0, -1);
        ren[3]->GetActiveCamera()->Azimuth(45);
        ren[3]->GetActiveCamera()->Dolly(1.15);
        ren[3]->ResetCameraClippingRange();
    
        vtkSmartPointer< vtkInteractorStyleImage > style = vtkSmartPointer< vtkInteractorStyleImage >::New();
        iren->SetInteractorStyle(style);
        iren->Initialize();
        iren->Start();
        return EXIT_SUCCESS;
    }
    

    这里写图片描述

    这里写图片描述

    展开全文
  • 平面

    千次阅读 2018-09-07 19:52:11
    时间限制:C/C++ 1秒,其他语言2秒 ...现在请你来确定他们的位置,使得划分形成的平面尽量. 输入描述: 一个整数n,如题所示。 输出描述: ​一个整数,表示最多把平面分成多少份。 示例输入 2 示例...

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    小a的平面上有n个X型不明物体,但是他不确定他们的位置。现在请你来确定他们的位置,使得划分形成的平面尽量多.

    输入描述:

    一个整数n,如题所示。

    输出描述:

    ​一个整数,表示最多把平面分成多少份。

    示例输入

    2

    示例输出

    11

    说明

    备注:

    n ≤ 10^9

    解题报告

    题意:求2n条直线最多可以把平面分成多少份。

    解题思路:n条直线最多可以把平面分成(n * (n + 1)) / 2 + 1.直接套公式。

    #include <iostream>
    using namespace std;
    int main()
    {
        long long n;
        while (cin >> n)
            cout << 2 * n * n + n + 1 << endl;
        return 0;
    }

     

    展开全文
  • 基本文种平面

    千次阅读 2012-08-07 14:28:21
    基本文种平面是Unicode中的一个编码区段。编码从U+0000至U+FFFF。 Unicode 基本文种平面的示意图。每个写着数字的格子代表256个码点。右图是基本文种平面的示意图。   定义 基本文种平面,BMP...

     

    基本多文种平面是Unicode中的一个编码区段。编码从U+0000至U+FFFF。 Unicode 基本多文种平面的示意图。每个写着数字的格子代表256个码点。右图是基本多文种平面的示意图。

     

    定义

    基本多文种平面BMP(Basic Multilingual Plane),或称第零平面(Plane 0),是Unicode中的一个编码区段。编码从U+0000至U+FFFF。

    图解

    Unicode 基本多文种平面的示意图。每个写著数字的格子代表256个码点。右图是基本多文种平面的示意图。颜色各代表了:

    基本多文种平面基本多文种平面
          黑 = 拉丁文字及符号 
          浅蓝 = Linguistic scripts
          蓝 = 其他欧洲文字
          橘 = Middle Eastern and SW Asian scripts
          浅橘 = 非洲文字
          绿 = 南亚文字
          紫 = 东南亚文字
          红 = 东亚文字
          浅红 = 中日韩汉字
          黄 = Aboriginal scripts
          紫红 = 符号
          深灰 = Diacritics
          浅灰 = UTF-16surrogates and private use
          蓝青 = Miscellaneous characters
          白 = 未使用

     

    现状

    现版本为修订4.10版,2005年9月19日出版。已分配编码区段为:
    0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)
    0080-00FF:C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)
    0100-017F:拉丁文扩展-A (Latin Extended-A)
    0180-024F:拉丁文扩展-B (Latin Extended-B)
    0250-02AF:国际音标扩展 (IPA Extensions)
    02B0-02FF:空白修饰字母 (Spacing Modifiers)
    0300-036F:结合用读音符号 (Combining Diacritics Marks)
    0370-03FF:希腊文及科普特文 (Greek and Coptic)
    0400-04FF:西里尔字母 (Cyrillic)
    0500-052F:西里尔字母补充 (Cyrillic Supplement)
    0530-058F:亚美尼亚语 (Armenian)
    0590-05FF:希伯来文 (Hebrew)
    0600-06FF:阿拉伯文 (Arabic)
    0700-074F:叙利亚文 (Syriac)
    0750-077F:阿拉伯文补充 (Arabic Supplement)
    0780-07BF:马尔代夫语 (Thaana)
    07C0-077F:西非书面语言 (N'Ko)
    0800-085F:阿维斯塔语及巴列维语 (Avestan and Pahlavi)
    0860-087F:Mandaic
    0880-08AF:撒马利亚语 (Samaritan)
    0900-097F:天城文书 (Devanagari)
    0980-09FF:孟加拉语 (Bengali)
    0A00-0A7F:锡克教文 (Gurmukhi)
    0A80-0AFF:古吉拉特文 (Gujarati)
    0B00-0B7F:奥里亚文 (Oriya)
    0B80-0BFF:泰米尔文 (Tamil)
    0C00-0C7F:泰卢固文 (Telugu)
    0C80-0CFF:卡纳达文 (Kannada)
    0D00-0D7F:德拉维族语 (Malayalam)
    0D80-0DFF:僧伽罗语 (Sinhala)
    0E00-0E7F:泰文 (Thai)
    0E80-0EFF:老挝文 (Lao)
    0F00-0FFF:藏文 (Tibetan)
    1000-109F:缅甸语 (Myanmar)
    10A0-10FF:格鲁吉亚语 (Georgian)
    1100-11FF:朝鲜文 (Hangul Jamo)
    1200-137F:埃塞俄比亚语 (Ethiopic)
    1380-139F:埃塞俄比亚语补充 (Ethiopic Supplement)
    13A0-13FF:切罗基语 (Cherokee)
    1400-167F:统一加拿大土著语音节 (Unified Canadian Aboriginal Syllabics)
    1680-169F:欧甘字母 (Ogham)
    16A0-16FF:如尼文 (Runic)
    1700-171F:塔加拉语 (Tagalog)
    1720-173F:Hanunóo
    1740-175F:Buhid
    1760-177F:Tagbanwa
    1780-17FF:高棉语 (Khmer)
    1800-18AF:蒙古文 (Mongolian)
    18B0-18FF:Cham
    1900-194F:Limbu
    1950-197F:德宏泰语 (Tai Le)
    1980-19DF:新傣仂语 (New Tai Lue)
    19E0-19FF:高棉语记号 (Kmer Symbols)
    1A00-1A1F:Buginese
    1A20-1A5F:Batak
    1A80-1AEF:Lanna
    1B00-1B7F:巴厘语 (Balinese)
    1B80-1BB0:巽他语 (Sundanese)
    1BC0-1BFF:Pahawh Hmong
    1C00-1C4F:雷布查语(Lepcha)
    1C50-1C7F:Ol Chiki
    1C80-1CDF:曼尼普尔语 (Meithei/Manipuri)
    1D00-1D7F:语音学扩展 (Phonetic Extensions)
    1D80-1DBF:语音学扩展补充 (Phonetic Extensions Supplement)
    1DC0-1DFF:结合用读音符号补充 (Combining Diacritics Marks Supplement)
    1E00-1EFF:拉丁文扩充附加 (Latin Extended Additional)
    1F00-1FFF:希腊语扩充 (Greek Extended)
    2000-206F:常用标点 (General Punctuation)
    2070-209F:上标及下标 (Superscripts and Subscripts)
    20A0-20CF:货币符号 (Currency Symbols)
    20D0-20FF:组合用记号 (Combining Diacritics Marks for Symbols)
    2100-214F:字母式符号 (Letterlike Symbols)
    2150-218F:数字形式 (Number Form)
    2190-21FF:箭头 (Arrows)
    2200-22FF:数学运算符 (Mathematical Operator)
    2300-23FF:杂项工业符号 (Miscellaneous Technical)
    2400-243F:控制图片 (Control Pictures)
    2440-245F:光学识别符 (Optical Character Recognition)
    2460-24FF:封闭式字母数字 (Enclosed Alphanumerics)
    2500-257F:制表符 (Box Drawing)
    2580-259F:方块元素 (Block Element)
    25A0-25FF:几何图形 (Geometric Shapes)
    2600-26FF:杂项符号 (Miscellaneous Symbols)
    2700-27BF:印刷符号 (Dingbats)
    27C0-27EF:杂项数学符号-A (Miscellaneous Mathematical Symbols-A)
    27F0-27FF:追加箭头-A (Supplemental Arrows-A)
    2800-28FF:盲文点字模型 (Braille Patterns)
    2900-297F:追加箭头-B (Supplemental Arrows-B)
    2980-29FF:杂项数学符号-B (Miscellaneous Mathematical Symbols-B)
    2A00-2AFF:追加数学运算符 (Supplemental Mathematical Operator)
    2B00-2BFF:杂项符号和箭头 (Miscellaneous Symbols and Arrows)
    2C00-2C5F:格拉哥里字母 (Glagolitic)
    2C60-2C7F:拉丁文扩展-C (Latin Extended-C)
    2C80-2CFF:古埃及语 (Coptic)
    2D00-2D2F:格鲁吉亚语补充 (Georgian Supplement)
    2D30-2D7F:提非纳文 (Tifinagh)
    2D80-2DDF:埃塞俄比亚语扩展 (Ethiopic Extended)
    2E00-2E7F:追加标点 (Supplemental Punctuation)
    2E80-2EFF:CJK 部首补充 (CJK Radicals Supplement)
    2F00-2FDF:康熙字典部首 (Kangxi Radicals)
    2FF0-2FFF:表意文字描述符 (Ideographic Description Characters)
    3000-303F:CJK 符号和标点 (CJK Symbols and Punctuation)
    3040-309F:日文平假名 (Hiragana)
    30A0-30FF:日文片假名 (Katakana)
    3100-312F:注音字母 (Bopomofo)
    3130-318F:朝鲜文兼容字母 (Hangul Compatibility Jamo)
    3190-319F:象形字注释标志 (Kanbun)
    31A0-31BF:注音字母扩展 (Bopomofo Extended)
    31C0-31EF:CJK 笔画 (CJK Strokes)
    31F0-31FF:日文片假名语音扩展 (Katakana Phonetic Extensions)
    3200-32FF:封闭式 CJK 文字和月份 (Enclosed CJK Letters and Months)
    3300-33FF:CJK 兼容 (CJK Compatibility)
    3400-4DBF:CJK 统一表意符号扩展 A (CJK Unified Ideographs Extension A)
    4DC0-4DFF:易经六十四卦符号 (Yijing Hexagrams Symbols)
    4E00-9FBF:CJK 统一表意符号 (CJK Unified Ideographs)
    A000-A48F:彝文音节 (Yi Syllables)
    A490-A4CF:彝文字根 (Yi Radicals)
    A500-A61F:Vai
    A660-A6FF:统一加拿大土著语音节补充 (Unified Canadian Aboriginal Syllabics Supplement)
    A700-A71F:声调修饰字母 (Modifier Tone Letters)
    A720-A7FF:拉丁文扩展-D (Latin Extended-D)
    A800-A82F:Syloti Nagri
    A840-A87F:八思巴字 (Phags-pa)
    A880-A8DF:Saurashtra
    A900-A97F:爪哇语 (Javanese)
    A980-A9DF:Chakma
    AA00-AA3F:Varang Kshiti
    AA40-AA6F:Sorang Sompeng
    AA80-AADF:Newari
    AB00-AB5F:越南傣语 (Việt Thái)
    AB80-ABA0:Kayah Li
    AC00-D7AF:朝鲜文音节 (Hangul Syllables)
    D800-DBFF:High-half zone of UTF-16
    DC00-DFFF:Low-half zone of UTF-16
    E000-F8FF:自行使用区域 (Private Use Zone)
    F900-FAFF:CJK 兼容象形文字 (CJK Compatibility Ideographs)
    FB00-FB4F:字母表达形式 (Alphabetic Presentation Form)
    FB50-FDFF:阿拉伯表达形式A (Arabic Presentation Form-A)
    FE00-FE0F:变量选择符 (Variation Selector)
    FE10-FE1F:竖排形式 (Vertical Forms)
    FE20-FE2F:组合用半符号 (Combining Half Marks)
    FE30-FE4F:CJK 兼容形式 (CJK Compatibility Forms)
    FE50-FE6F:小型变体形式 (Small Form Variants)
    FE70-FEFF:阿拉伯表达形式B (Arabic Presentation Form-B)
    FF00-FFEF:半型及全型形式 (Halfwidth and Fullwidth Form)
    FFF0-FFFF:特殊 (Specials)

     

    转载自:

    http://dict.youdao.com/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E6%96%87%E7%A7%8D%E5%B9%B3%E9%9D%A2/#

    展开全文
  • 1、首先从相机坐标系开始吧,物点在相机坐标系下所在的平面叫做物平面(当然还有世界坐标系,但是那个就涉及外参了,本文暂不讨论那个); 2、物平面的点通过小孔成像后,投到成像平面(相机光心之后),虽然此时.....

    随着理解的加深,我又更新了一下,比之前更标准一些: 

    经过好几天对于slam里那好几个平面的倒来倒去,零基础的我快要疯掉了,还好我理出了些头绪,和大家一起分享。

    我们从头开始一步一步理一下:

    1、首先从相机坐标系开始吧,物点在相机坐标系下所在的平面叫做物平面(当然还有世界坐标系,但是那个就涉及外参了,本文暂不讨论那个);

    2、物平面的点通过小孔成像后,投到成像平面(相机光心之后),虽然此时的面是真正的成像平面,但是此时得到的坐标是负的,很麻烦的;

    3、为了方便计算我们把该成像平面放到相机之前,并且以后都这么算,然后把此平面叫做成像平面,注意此时推到过程是:将X和Y坐标乘以f(焦距)除以Z(z坐标),因为此过程会将3D转化成2D,所以Z肯定要被消去,这样理解可能更直观,本质还是三角形相似;又因为平行光成像都成在焦平面嘛,所以乘以f是理所应当的;

    4、由于此时单位依旧是米,我们最终得到的可是像素坐标,单位是像素,所以还需要一个米与像素之间的缩放。公式里是α和β,当然我们还需要把整个点挪到像素原点去,像素图像的原点在左上角,图形的原点在中心,此时有一个cx,cy的平移,但是面的位置没有改变,但是性质变了,已经成为像素平面了,单位是pixel。

    现在回头看,我们需要做的是:

    ① 把第2步省去,因为加负号不是我们想要的,所以我们的脑海里将不再有相机之后的平面了;

    ② 推导出归一化平面,把第3步分开,先除Z,此时物平面就转到了相机前单位距离处,这时归一化平面就有了。之后再乘以f,让归一化平面挪到成像平面

    ③ 把乘f,米与像素的缩放(α、β),平移(cx,cy)整合成内参矩阵K。

    所以最终的过程就是从物平面除以Z变成归一化平面,乘以f变成成像平面,缩放平移变成像素平面,也可以乘以内参由归一化平面变成像素平面。我们平时用归一化平面多一些,毕竟齐次嘛,可以忽略物点深度的影响。这样看来,由近及远以此是:相机平面,归一化平面(1),成像平面(f),像素平面(f)

    再来一张自己做的一张图吧,可能和别的博主有相似的地方:

    本文没涉及外参(也同相机位姿)只有内参

    展开全文
  • 平面平面图的概念与性质 定义 能把图G花在平面上,使得边与边之间没有交叉,称G可以嵌入平面,或称G是可平面图。G的平面嵌入表示的图称为平面图 一个平面图G把平面分成若干连通片,这些连通片称为G的一个面或...
  • 控制平面与数据平面定义

    万次阅读 2013-03-17 20:15:34
    管理平面/控制平面(统称控制平面) 管理平面是提供给网络管理人员使用TELNET、WEB、SSH、SNMP、RMON 等方式来管理设备,并支持、理解和执行管理人员对于网络设备各种网络协议的设置命令。管理平面提供了控制平面...
  • 平面分割

    千次阅读 2017-01-22 09:39:57
    平面分割 描述 Description 【问题描述】  同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域? 【输入格式】  两个整数n(n≤500)和p...
  • 平面方程拟合计算 平面方程的一般表达式为: , ( ) 记: 则: 平面方程拟合: 对于一系列的n个点 : 要用点 拟合计算上述平面方程,则使: 最小。 要使得S最小,应满足: 即: 有, 或, 解上述线形方程组,得: 即...
  • 线分割平面平面分割空间问题

    千次阅读 2016-01-27 14:48:39
    (1) n条直线最多分平面问题 题目大致如:n条直线,最多可以把平面分为多少个区域。 析:可能你以前就见过这题目,这充其量是一道初中的思考题。但一个类型的题目还是从简单的入手,才容易发现规律。当有n-1条直线时,...
  • 一、最大间隔平面分类器介绍最近在做论文复现的工作,论文的名称是“Disentangling Disease Heterogeneity with Max-Margin Multiple Hyperplane Classifier”,其目的是利用最大间隔平面分类器对疾病的异质...
  • 在论文中提出了一个算法,能够在类似Kinect 传感器采集到的点云进行实时可靠的多平面的检测。具体的算法一共有三个步骤: 第一步:生成图模型(每一个节点都代表的是一个点集,每条边代表点集之间的关系); 第二...
  • 基本文种平面--unicode编码

    千次阅读 2006-11-30 10:31:00
    基本文种平面,BMP(Basic Multilingual Plane),或称第零平面(Plane 0),是Unicode中的一个编码区段。编码从U+0000至U+FFFF。 上圖是基本文種平面的示意圖。顏色各代表了: 黑 = 拉丁文字及符號 淺藍 = ...
  • 折线分割平面

    千次阅读 2018-09-07 20:47:25
    我们看到过很直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。 I...
  • SVD平面拟合原理

    千次阅读 2019-12-10 13:25:21
    SVD平面拟合原理
  • CDR类CAD制作室内装修平面

    千次阅读 2014-11-06 10:58:32
    多平面设计教程可登陆e良师益友网学习。 首先看一下CAD的平面布局图。 1、打开Coreldraw软件,在绘图窗口处双击,则弹出选项窗口,设置全局比例,平面图是1:80。如图。 2、用矩形工具画一个如图...
  • SDN控制平面

    千次阅读 2019-05-08 17:54:38
    1.SDN控制平面 2.SDN控制器体系架构 3.SDN控制器的关键技术 ...SDN控制平面一般由一个或个SDN控制器组成,是网络的大脑。控制器具有举足轻重的地位,它是连接底层交换设备与上层应用的桥梁。一...
  • 谈谈超平面

    千次阅读 2013-11-29 16:41:39
    有些东西,还是说清楚的好,比如超平面(hyperplane)这个东西。 直线、平面 在说超平面之前,先说说 Rn 空间中的直线和平面。给定 Rn 空间中的一点 p 和一非负向量 v⃗,满足 i=tv⃗+p 的点 i ...
  • 在二维平面内,已知共点的条线基本可以通过解析几何的方法将点求出。但是在计算机中,由于浮点数等计算误差,导致条线中相交的点不在同一位置。另外,在现实情况中,测距、测坐标等传感器所带来的误差,将条线...
  • 平面设计学费,平面设计学费大概多少,相信很同学对于这个问题很苦恼,因为想学平面设计但是又担心很贵,其实我想告诉大家其实也不是很贵,看你如何选择,接下来由我用本文给大家介绍一下吧。 平面设计学费,平面...
  • 其实这个问题是很简单,但是呢,我认识的很圈外的朋友和新手都说:计算机平面设计很简单、把PS学会就可以了;计算机平面设计太简单了,没技术含量…每次听到这里真难受,真想扇Ta一巴掌,如果一开始你把平面设计想...
  • 高等数学关于切线,法线,切平面,法平面的详细解释 简介 本文章主要对高数下几个切线和切平面的总结 文章内容 平面曲线的切线和法线 空间曲线的切线和法平面 曲面的切平面和法线 平面曲线的切线和法线 我们...
  • 这个问题在解数学题的时候不需要想,按照已知条件带入公式求值计算即可,到最后会化简成几个多项式,可以用多种方法求解。比较麻烦的是用编程的方法计算多项式是件很麻烦的事情,至少在下觉得写出来的代码不会太...
  • ransac平面拟合

    千次阅读 2017-06-03 20:27:35
    pcl::SampleConsensusModelPlane实现采样一致计算的三维平面模型分割类。 下面一段代码演示利用上述两个类拟合空间平面方程。 首先生成点云数据,设定空间平面方程为x +y+z=1,其中每隔五个点生成一个点作为噪声点...
  • 线分平面平面分空间

    千次阅读 2011-03-17 18:06:00
    (1) n条直线最多分平面问题 题目大致如:n条直线,最多可以把平面分为多少个区域。 析:可能你以前就见过这题目,这充其量是一道初中的思考题。...这样就出了2+(n-2)个区域。
  • 变量微积分笔记12——平面向量场

    千次阅读 2018-04-10 18:06:42
    是单位向量,M和N是关于x和y的函数,也就是平面向量场中的所有向量都取决于x和y。  场的概念其实很常见,比如风向场,每一点的风都可以用一个向量表示:  台风的风向场:  在物理学中常见的还有水流场和引力场。...
  • 平面设计专业的相关人才在毕业后会被广泛的分配到各个领域发挥自己的才能和优势,受到很行业的好评,这都得益于掌握的专业技能更加丰富。那么平面设计专业学什么?大学平面设计主修课程有哪些呢?今天昕泽雨就来跟...
  • 因为我们是获取手机的gps坐标,我们起先是使用的甲方提供的坐标转换服务,发现84大地转到深圳独立坐标(深圳高斯平面坐标)时精度误差极大。于是甲方给我们提供了部分控制点信息,让我们自己去完成坐标的转换,不再...
  • 线切割平面问题

    千次阅读 2013-05-22 08:42:29
    直线切割平面 当一个平面上没有直线的时候,可以看成被分成了1份; 有1条直线的时候,没有结点,了1部分; 有2条直线的时候,了1个节点,了2部分; 有3条直线的时候,了2个节点,了3部分; ····...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,136
精华内容 85,654
关键字:

多平面