当前位置:首页 > 代码 > 正文

包含鱼眼图像校正delphi源代码的词条

admin 发布:2022-12-19 09:36 139


本篇文章给大家谈谈鱼眼图像校正delphi源代码,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何利用ZEMAX的畸变数据进行鱼眼镜头的矫正?

是探测云量的新型武器呢。里眼镜头的镜面好像金鱼凸起的眼睛,比广角镜头拍摄的范围更大。它可以把全天空的云都拍进一张照片,相当于给全天空的云彩来了张“集体照”!这张“集体照”被自动发往数据库进行分析,科学家就能轻松、准确地计算出云彩占全天空的百分比,也就是云量了。云彩有多高?它们有的仿佛远在天边,有的好像一伸手就能摸到。过去,气象学家用肉眼估测云高,难免有误差。于是,一把擎天“巨尺”出现了,它就是激光云高仪。激光和普通灯光不一样,它们更团结,即使距离很远,也能保持光点的清晰和集中。发现了这个秘密后,科学家将激光从地面垂直射向天顶,激光遇到云会发生反射回到地面,科学家就可以计算云高了。激光云高仪可以探测的云层多达3层以上。

求鱼眼镜头全景图像校正算法的matlab代码

(一) opencv里面摄像机标定计算内参数矩阵用的是张正友标定法,非常经典,MATLAB标定工具箱也是用的该方法。具体的标定过程可以参见张正友的原文: 。或者参考博文:

(二) 基于opencv的摄像机标定用的主要函数有:

cvFindChessboardCorners:提取一幅图片上的所有角点。

cvFindCornerSubPix:亚像素精确化。

cvDrawChessboardCorners:显示角点。

cvCalibrateCamera2:标定摄像机参数,求出内参数矩阵,畸变系数,旋转向量和平移向量。

校正主要用的函数有2个:

cvInitUndistortMap:根据cvCalibrateCamera2计算出来的内参数矩阵和畸变系数计算畸变映射。

cvRemap:根据畸变映射校正图像。

(三)详细的过程及参考书籍:

1、《基于OpenCV的计算机视觉技术实现》 陈胜勇,刘盛编著 科学出版社,2008;(该书用OpenCV 1.0库,第14章详细介绍如何用opencv进行摄像机标定,包括摄像机标定的原理,opencv相关库函数详细的介绍以及例子)

2、《学习OpenCV(中文版)》 于仕琪译 清华大学出版社,2009;(OpenCV 2.0库,第11、12章详细介绍如何进行摄像机标定以及三维重建)

3、OpenCV的标定参数中,对于镜头畸变采用的方法是Brown博士在71年发表的文章中提到的。

(四)MATLAB标定也在这里提一下:

,该网站有很详细的使用说明

matlab标定工具箱来进行标定,它也是基于张正友的平面标定方法的,有误差分析、标定结果三维重建、重投影计算角点等功能 。

Matlab中的镜头畸变参数采用基于Heikkil博士提出的方法,将非线性干扰因素引入到内外参数的求解过程。标定的过程需要手动选取四个角点,标定图片拍摄的多的话,比较麻烦。

(五)实验结果

自己买了个手机鱼眼镜头,拍摄了16幅标定板图片。注意拍摄的角度不要和成像平面平行。

示例程序049--摄像机标定和鱼眼校正

如何在DuiLib中绘制用户数据

在DuiLib中有时需要在窗口中绘制图形或图像,如画相关的曲线或OpenCV处理图像的Mat数据,此时DuiLib就没有直接的函数可对界面进行操作,本文描述了一种基于Win窗口的折中方法。

1、定义CWndUI类,使其能够加入到DuiLib中

class CWndUI: public CControlUI

{

public:

CWndUI(): m_hWnd(NULL){}

virtual void SetVisible(bool bVisible = true)

{

__super::SetVisible(bVisible);

::ShowWindow(m_hWnd, bVisible);

}

virtual void SetInternVisible(bool bVisible = true)

{

__super::SetInternVisible(bVisible);

::ShowWindow(m_hWnd, bVisible);

}

virtual void SetPos(RECT rc)

{

__super::SetPos(rc);

::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);

}

BOOL Attach(HWND hWndNew)

{

if (! ::IsWindow(hWndNew))

{

return FALSE;

}

m_hWnd = hWndNew;

return TRUE;

}

HWND Detach()

{

HWND hWnd = m_hWnd;

m_hWnd = NULL;

return hWnd;

}

HWND GetHWND()

{

return m_hWnd;

}

protected:

HWND m_hWnd;

};

2、定义并注册窗口和窗口处理函数

ATOM MyRegisterWnd(TCHAR *szClsName, WNDPROC WndProc)

{WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = GetModuleHandle(NULL);

wcex.hIcon = NULL;// LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST));

wcex.hCursor = NULL;//LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = GetStockBrush(LTGRAY_BRUSH); //(HBRUSH)(COLOR_WINDOW + 1);

wcex.lpszMenuName = NULL;// MAKEINTRESOURCE(IDC_TEST);

wcex.lpszClassName = szClsName;

wcex.hIconSm = NULL;// LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(wcex);

}

窗口处理函数为:

LRESULT CALLBACK CallbackImageCalibration(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

// int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc; HBRUSH hRedBrush;

static int cxClient, cyClient;

RECT rect;

HBRUSH hbrush;

switch (message)

{

case WM_SIZE:

cxClient = LOWORD(lParam);

cyClient = HIWORD(lParam);

::PostMessage(hWnd, WM_PAINT, NULL, NULL);

return 0;

case WM_ERASEBKGND:

hdc = GetDC(hWnd);//要十分注意局部变量的使用,假如在这里没有获取dc,那么就会擦除失败。

hbrush = CreateSolidBrush(RGB(0, 0, 0));//新建画刷

GetClientRect(hWnd, rect);

FillRect(hdc, rect, hbrush);

ReleaseDC(hWnd, hdc);

return TRUE;

case WM_PAINT:

hdc = BeginPaint(hWnd, ps);

m_fc.DrawriginImage(hWnd);// m_fc为鱼眼图像校正的类

EndPaint(hWnd, ps);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

在主程序中注册窗口

TCHAR szClsName[256] = _T("#32775");

MyRegisterWnd(szClsName, CallbackImageCalibration);

3、定义DuiLib界面XML文件中的要素并创建

HorizontalLayout name="ctnClient1" bkcolor="#FF0E0E0E" !-- 由于Layout控件都是Container的子类,所以Layout控件可以直接代替Container --

Wnd1 name="wndImageCalibration" visible="false"/

/HorizontalLayout

创建名称为Wnd1的窗口

CControlUI* CFIPFrameWnd::CreateControl(LPCTSTR pstrClassName)

{

if (_tcsicmp(pstrClassName, _T("Wnd1")) == 0)

{

CWndUI *pUI = new CWndUI;

m_hwndImageCalibration = CreateWindow(_T("#32775"), _T("WndImageCalibration"), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, m_PaintManager.GetPaintWindow(), (HMENU)0, NULL, NULL);

pUI-Attach(m_hwndImageCalibration);

pUI-SetVisible(true);

::ShowWindow(m_hwndImageCalibration, true);

::UpdateWindow(m_hwndImageCalibration);

return pUI;

}

Return pUI;

}

4、重新绘制窗口

这里展示的是一段鱼眼图像校正的函数。

CControlUI *pbtnWnd = m_PaintManager.FindControl(_T("wndImageCalibration"));

pbtnWnd-SetVisible(true);

//按照DuiLib的模式获取控件的实体类

CListUI* pListUI = static_castCListUI*(m_PaintManager.FindControl(_T("imageCalibrationlist")));

int nSel = pListUI-GetCurSel();//获得左边的

m_fc.fix_data = NULL;// m_fc为鱼眼图像校正的类

if (nSel = 0)

{

string_t filename = m_imageCalibrationList.at(nSel);

Mat mat = imread(filename);

CComboBoxUI* pComboboxUI = static_castCComboBoxUI*(m_PaintManager.FindControl(_T("calibrationMethodlist")));

int nMethod = pComboboxUI-GetCurSel();//获得校正方法,经度、双精度、经纬、柱面等

m_fc.Init(mat.cols, mat.rows, CalibrationType(nMethod));

m_fc.org_mat = mat.clone();

float time = m_fc.Calibration();//开始校正鱼眼图像

CLabelUI *pLabelUI = static_castCLabelUI*(m_PaintManager.FindControl(_T("ImageCalibrationInfo")));

CDuiString strTmp;

strTmp.Format(_T("图像校正时间:%f秒"), time);

pLabelUI-SetText(strTmp);

RECT r;

::GetWindowRect(m_hwndImageCalibration, r);

::InvalidateRect(m_hwndImageCalibration,r,true);//重新绘制

}

其中重绘的函数是在鱼眼校正的类中,m_fc. DrawriginImage函数

void FisheyeCalibration::DrawriginImage(HWND hwnd)

{

if (fix_mat.data)

{

WinShowMatImage(fix_mat, hwnd);

}

}

void FisheyeCalibration::WinShowMatImage(const cv::Mat img, HWND hwnd)

{

if (!::IsWindow(hwnd)) return;

HDC hdc = ::GetWindowDC(hwnd);

RECT rect;

GetWindowRect(hwnd, rect);

RECT destRect;

destRect.left = 0; destRect.top = 0;

destRect.right = rect.right - rect.left;

destRect.bottom = rect.bottom - rect.top;

//判断长和宽

if ( img.cols(rect.right - rect.left) img.rows(rect.bottom - rect.top))

{

int tmp1 = ((rect.right - rect.left) - img.cols) / 2;

int tmp2 = ((rect.bottom - rect.top) - img.rows) / 2;

destRect.left = tmp1; destRect.right = tmp1 + img.cols;

destRect.top = tmp2; destRect.bottom = tmp2 + img.rows;

}

else

{

if (rect.bottom == rect.top) return;

float ratio1 = (float)(rect.right - rect.left) / (float)(rect.bottom - rect.top);

float ratio2 = (float)img.cols / (float)img.rows;

if (ratio1 ratio2)

{

int w = ratio2*(rect.bottom - rect.top);

int h = rect.bottom - rect.top;// ratio2*img.rows;

destRect.left = (rect.right - rect.left - w) / 2; destRect.right = (rect.right - rect.left - w) / 2 + w;

destRect.top = 0; destRect.bottom = h;

}

else

{

int w = rect.right - rect.left;// ratio1*img.cols;

int h = (rect.right - rect.left) / ratio2;// ratio1*img.rows;

destRect.left = 0; destRect.right = w;

destRect.top = (rect.bottom - rect.top - h) / 2; destRect.bottom = (rect.bottom - rect.top - h) / 2 + h;

}

}

CvMat _img = img;

const CvArr* arr = _img;

CvMat stub;

CvMat* image = cvGetMat(arr, stub);

// 构造BITMAPINFO头

SIZE size = { image-width, image-height };

int channels = 3;

BITMAPINFO binfo;

memset(binfo, 0, sizeof(binfo));

BITMAPINFOHEADER bmih = binfo.bmiHeader;

bmih.biSize = sizeof(BITMAPINFOHEADER);

bmih.biWidth = size.cx;

bmih.biHeight = abs(size.cy);

bmih.biPlanes = 1;

bmih.biBitCount = (unsigned short)(channels * 8);

bmih.biCompression = BI_RGB;

void* dst_ptr = 0;

HBITMAP hb = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS, dst_ptr, 0, 0);

HDC windowdc = ::CreateCompatibleDC(hdc);

SelectObject(windowdc, hb);

CvMat dst;

cvInitMatHeader(dst, size.cy, size.cx, CV_8UC3, dst_ptr, (size.cx*channels + 3)-4);

int origin = ((IplImage*)arr)-origin;

cvConvertImage(image, dst, 1/*origin == 0 ? CV_CVTIMG_FLIP : 0*/);

// 显示

SetStretchBltMode(hdc, COLORONCOLOR);

StretchBlt(hdc, destRect.left+1, destRect.top+1, destRect.right - destRect.left, destRect.bottom - destRect.top, windowdc, 0, 0, size.cx, size.cy, SRCCOPY);

}

鱼眼图像如何求得角度偏了多少度

在一个圆形的“鱼眼”区域内,越靠近圆心,让像素偏移得越厉害。使用DisplacementMapFilter实现鱼眼特效很重要的一点就是创建一个辅助圆,这个圆的区域就是鱼眼区域,而圆的像素的颜色值将会起到重要作用。在滤镜渲染的时候,这些颜色值参与计算,并根据计算结果改变原有位图的像素位置,算法公式如下:

dstPixel[x, y] = srcPixel[x + ((componentX(x, y) - 128) * scaleX) / 256,

y + ((componentY(x, y) - 128) *scaleY) / 256)];

鱼眼镜头怎么校正

1、鱼眼图像的畸变矫正是以某种独特的变换方式将一副鱼眼图像转换为理想图像的操作,这种操作在全方位视觉导航中具有重要的作用,是系统自动识别、跟踪和定位目标所必须的基础操作。根据畸变图像特点标定坐标图,求取标定点像素的理想值和实际值,同时生成坐标映射表,再把坐标映射表用于畸变图像的校正程序后,即可得到无畸变图像,具体处理过程如下:

2、打开鱼眼镜头图片,然后复制一层;然后点击滤镜-自适应广角;再弯曲的高楼处画线,纠正其位置;弄好后,点击裁剪工具把空白位置进行裁剪;最后点击保存。

3、可以看到校正后的图像中点与点之间的间隔均匀,排列整齐。

更多关于鱼眼镜头怎么校正,进入:查看更多内容

关于鱼眼图像校正delphi源代码和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/6066.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载