当前位置:首页 » 打标机器 » vjc机器人灰度怎么编程

vjc机器人灰度怎么编程

发布时间: 2021-03-06 23:09:29

机器人视觉分析(编程高手进)

我们来处理的图像一般是灰自度图像,也就是只有一个通道,一个像素点可分为0到255个明暗的程度。两幅图像找出有什么不同就必须根据这个来判别(前提是定位要比较准确),当然这是最基本的,现在我们可以把两幅图像分别抽象成个矩阵,每个值是0到255,再将两矩阵相应的值相减,比如两幅图像是一模一样,的出的结果理论上就都是0,就是一幅黑色的图像,如果不一样则会有亮点 描述的不怎么好 希望对你有帮助

Ⅱ 学习机器人

(下面是我原来给一位初中生相关问题的回答可以参考一下····)
怎么做小型简单的机器人。。。

浏览次数:66次悬赏分:80 | 解决时间:2011-6-3 20:18 | 提问者:461102393 | 检举

我想请问··你所说的··自己做是指的什么呢?是指自己买零件来搭建···还是·说完全靠自己一个一个零件做出来··
好吧··其实我觉得后面那个想法对于一个初中生来说几乎是不可能的事。我们在大学都还是买来的零件··如果你真的要自己做的话··呃·先学好初中基本电路知识吧··然后你以后要学单片机··学传感器原理··还要学控制·学编程···道路是曲折的·前途是光明的··呵呵
对于前一个想法,还是可以实现的··首先·你要有一块主板··可以是乐高上拆下来的··可以是其他公司上机器人(比如:广茂达··的)·拆下来的·可以直接到网上买一块主板··然后··你要想好··你想要搭建一个什么样的机器人··主要是你想要让你的机器人实现一个什么功能··比如··你想要你的机器人·沿白色曲线·行走··那么你就需要一个灰度传感器·(光感器··用来测颜色的·)连接上你的主板·通过程序来控制···或者你想要制造一个··寻找光源的·机器人··在黑暗中·会自动移动到光源处··那么你需要几个电机··一块控制主板··一个光感器·加一套程序··收工··
呃·如果你认为·小型简单的机器人·就是一个会移动的·机器的话··那还是去买个·四驱车吧···机器人·之所以称为机器人··我觉得主要的·是它能实现人们想要它实现的功能··
其实··我认为·如果·真的对这方面·很感兴趣的话·对于一个初中生·还是学好各方面知识先吧··然后·上一个·有机器人兴趣小组的高中··最好是有老师带的·能代表学校去参赛的·那样会学到很多东西·的··也会交到很多·有同样兴趣的朋友··我的高中就是这样过的··提前接触这些知识·对以后上大学也很有帮助··
就这些了··还有问题留言··

================================我是华丽的分割线============================

嗯··你以前玩过机器人··应该就是类似于乐高·广茂达·这样的机器人··有些基础了·如果你之前玩的时候是用图表编程的话··我建议你先学习C语言··因为以后无论是对你的机器人制作方面还是上大学后的学习·都是有帮助的·(能在高中拿个奖就happy了·可以参加各种大学的自主招生还有··成绩好·学校好的话··还可能保送很好的大学·)

PS:欢迎追分,最近缺分用··嘿嘿。

Ⅲ 激光雕刻机编程用的是什么图。。灰度图还是精雕图。。说详细点

激光雕刻机其实只是路径的输出,你说的什么灰度图,精雕图我没听说过~专我们一般把图属片分为位图和矢量图.CAD,CDR等软件一般就是画位图的,位图特点是任你放大都不会失真,线就是线,它是一个路径。而矢量图就是PS画的图,正常照片之类了,放大任何一个地方都会出现失真,它不是路径图。

激光雕刻机一般是CAD,CDR输出的,这两样输出用得比较多。按照实际尺寸画图(超出激光机雕刻尺寸输出会提示错误,有些低价激光机不会提示,但是超出部分直接不雕刻),然后按照颜色分输出顺序。

至于激光强弱快慢,是激光机自带软件可以设置的,比较容易操作

Ⅳ VJC1.5开发版使用手册

1、执行器模块库,传感器模块库,控制模块库,程序模块库,模拟输入,灰度检测.
2、直行模回块主要是答控制机器人的前进和后退;转向模块,控制机器人的转向;启动电击模块主要用于控制机器人左右电机功率,其可实现左右两只主轮按照不同速度,不同方向行走,如走直线弧线,旋转等;停止电机主要用于关闭驱动电机和扩展电机;显示是使机器人在LED屏上显示信息;延时等待是使机器人的前一个状态保持一段时间;
3、用于检测环境的光线明暗,数值在0到255之间,数值越大,表示光线越暗。
4、用于检测声音的大小,反馈的数值在0到255之间,数值越大表示检测到的声音越响,数值越小表示越弱。
5、16个多任务和10个子程序。
6、黄色代表此变量已有数值;白色代表此变量还是空的。可以把每个变量想象成一个抽屉,存放或者读取数值都需要变量百宝箱分配的钥匙。
7、是的。
8、是指往变量存放数值。
9、是指从变量里读取数值。

Ⅳ 求用vc++编程实现显示灰度直方图的详细步骤,越详细越好

步骤和程序:
打开VC程序——文件——新建——工程中的MFC AppWizard(exe),在工程下面的框中输入工程名(假定工程名为111),点确定——选多重文档,点下一个——后面都点下一个直到完成确定,基本框架就完成了,下面就加代码。
这时VC界面上左边框的下面有三个按钮:ClassView、ResourceView和FileView,ClassView里面是工程111的类:CAdoutDlg、CChildFrame、CMy111App、CMy111Doc、CMy111View和Globals;点ResourceView里面是资源类:Accelerator、Dialog、Icon、Menu、String Table、Toolbar和Version;点开FileView里面是文件类:Source File、Header Files、Resource Files和ReadMe.txt。
点界面的“工程”按钮——添加工程——新建——选C++ Source File,在文件下面的框里输入文件名(如DIBAPI),点“结束”,这样在FileView中的Source Files里面就多了一个DIBAPI.cpp文件,所有的代码都加在该文件中。再点界面的“工程”按钮——添加工程——新建——选C/C++ Header File,在文件下面的框里输入文件名(和前面的文件名必须一致),点“结束”,这样在FileView中的Header Files里面就多了一个DIBAPI.h文件,该文件是DIBAPI.cpp的头文件。
点开DIBAPI.h文件,里面是空白的,把如下代码考入文件中:
//DIBAPI.h
#ifndef _INC_DIBAPI
#define _INC_DIBAPI

DECLARE_HANDLE(HDIB);

#define PALVERSION 0x300

#define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))

#define RECTWIDTH(lpRect) ((lpRect)->right-(lpRect)->left)

#define RECTHEIGHT(lpRect) ((lpRect)->bottom-(lpRect)->top)

#define WIDTHBYTES(bits) (((bits)+31)/32*4)

#define DIB_HEADER_MARKER ((WORD)('M'<<8)|'B')

BOOL WINAPI PaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette* pPal);
BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* cPal);
LPSTR WINAPI FindDIBBits(LPSTR lpbi);
DWORD WINAPI DIBWidth(LPSTR lpDIB);
DWORD WINAPI DIBHeight(LPSTR lpDIB);
WORD WINAPI PaletteSize(LPSTR lpbi);
WORD WINAPI DIBNumColors(LPSTR lpbi);
HGLOBAL WINAPI CopyHandle(HGLOBAL h);

BOOL WINAPI SaveDIB(HDIB hDib,CFile& file);
HDIB WINAPI ReadDIBFile(CFile& file);

//在此处输入自己的函数声明

#endif//!_INC_DIBAPI

上面这些函数是实现图像的读取、存储等图像处理的基本功能的,你将自己需要的函数也输入到“//在此处输入自己的函数声明”的下面。
点开DIBAPI.cpp文件,里面是空白的,将如下代码加入其中:
//DIBAPI.cpp

#include "stdafx.h"
#include "DIBAPI.h"

WORD WINAPI DIBNumColors(LPSTR lpbi)
{
WORD wBitCount;

if(IS_WIN30_DIB(lpbi))
{
DWORD dwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;

if(dwClrUsed)
return (WORD)dwClrUsed;
}

if(IS_WIN30_DIB(lpbi))
wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount;
else
wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount;

switch(wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}

WORD WINAPI PaletteSize(LPSTR lpbi)
{
if(IS_WIN30_DIB(lpbi))
return (WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD));
else
return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE));
}

LPSTR WINAPI FindDIBBits(LPSTR lpbi)
{
return (lpbi+*(LPDWORD)lpbi+::PaletteSize(lpbi));
}

DWORD WINAPI DIBWidth(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc;

lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;

if(IS_WIN30_DIB(lpDIB))
return lpbmi->biWidth;
else
return (DWORD)lpbmc->bcWidth;
}

DWORD WINAPI DIBHeight(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc;

lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;

if(IS_WIN30_DIB(lpDIB))
return lpbmi->biHeight;
else
return (DWORD)lpbmc->bcHeight;
}

BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal)
{
LPSTR lpDIBHdr;
LPSTR lpDIBBits;
BOOL bSuccess=FALSE;
HPALETTE hPal=NULL;
HPALETTE hOldPal=NULL;

if(hDIB==NULL)
return FALSE;

lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
lpDIBBits=FindDIBBits(lpDIBHdr);

if(pPal!=NULL)
{
hPal=(HPALETTE)pPal->m_hObject;
hOldPal=::SelectPalette(hDC,hPal,TRUE);
}

::SetStretchBltMode(hDC,COLORONCOLOR);

if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))
{
bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
(int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
}
else
{
bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
}

::GlobalUnlock((HGLOBAL)hDIB);

if(hOldPal)
::SelectPalette(hDC,hOldPal,TRUE);

GlobalUnlock(hDIB);

return bSuccess;
}

BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal)
{
LPLOGPALETTE lpPal;
HANDLE hLogPal;
HPALETTE hPal=NULL;
LPSTR lpbi;
LPBITMAPINFO lpbmi;
LPBITMAPCOREINFO lpbmc;
BOOL bWinStyleDIB;
int i;
WORD wNumColors;
BOOL bResult=FALSE;

if(hDIB==NULL)
return FALSE;

lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
lpbmi=(LPBITMAPINFO)lpbi;

lpbmc=(LPBITMAPCOREINFO)lpbi;

wNumColors=DIBNumColors(lpbi);

bWinStyleDIB=IS_WIN30_DIB(lpbi);

if(wNumColors!=0)
{
hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);

if(hLogPal==0)
{
::GlobalUnlock((HGLOBAL)hDIB);
return FALSE;
}

lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal);

lpPal->palVersion=PALVERSION;
lpPal->palNumEntries=(WORD)wNumColors;
bWinStyleDIB=IS_WIN30_DIB(lpbi);

for(i=0;i<(int)wNumColors;i++)
{
if(bWinStyleDIB)
{
lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;
lpPal->palPalEntry[i].peFlags=0;
}
else
{
lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;
lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;
lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue;
lpPal->palPalEntry[i].peFlags=0;
}
}

bResult=pPal->CreatePalette(lpPal);

::GlobalUnlock((HGLOBAL)hLogPal);
::GlobalFree((HGLOBAL)hLogPal);
}

::GlobalUnlock((HGLOBAL)hDIB);
return bResult;
}

HGLOBAL WINAPI CopyHandle(HGLOBAL h)
{
if(h==NULL)
return NULL;

DWORD dwLen=::GlobalSize((HGLOBAL)h);

HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen);

if(hCopy!=NULL)
{
void* lpCopy=::GlobalLock((HGLOBAL)hCopy);
void* lp=::GlobalLock((HGLOBAL)h);

memcpy(lpCopy,lp,dwLen);

::GlobalUnlock(hCopy);
::GlobalUnlock(h);
}
return hCopy;
}

BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;

if(!hDib)
return FALSE;

lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);

if(lpBI==NULL)
return FALSE;

if(!IS_WIN30_DIB(lpBI))
{
::GlobalUnlock((HGLOBAL)hDib);
return FALSE;
}

bmfHdr.bfType=DIB_HEADER_MARKER;

dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);

if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
dwDIBSize+=lpBI->biSizeImage;
else
{
DWORD dwBmBitsSize;
dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
dwDIBSize+=dwBmBitsSize;

lpBI->biSizeImage=dwBmBitsSize;
}

bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2=0;

bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+::PaletteSize((LPSTR)lpBI);

TRY
{
file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
file.WriteHuge(lpBI,dwDIBSize);
}
CATCH(CFileException,e)
{
::GlobalUnlock((HGLOBAL)hDib);
THROW_LAST();
}
END_CATCH

::GlobalUnlock((HGLOBAL)hDib);

return TRUE;
}

HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;

dwBitsSize=file.GetLength();

if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))
return NULL;

if(bmfHeader.bfType!=DIB_HEADER_MARKER)
return NULL;

hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);

if(hDIB==0)
return NULL;

pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);

if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))
{
::GlobalUnlock((HGLOBAL)hDIB);
::GlobalFree((HGLOBAL)hDIB);
return NULL;
}

::GlobalUnlock((HGLOBAL)hDIB);

return hDIB;
}

//在此处输入自己的函数定义

上面是DIBAPI.h头文件中声明的函数的定义,你将自己的函数定义加到“//在此处输入自己的函数定义”后面。
下面加相应的消息映射函数,点Ctrl+W键,会出现MFC ClassWizard对话框,点Message Maps,在Class name下面的框中选择CMy111Doc,在Messages里面选中OnOpenDocument,然后点击Add Function按钮就加入了相应的消息映射函数,同样的方法以此加入OnSaveDocument、DeleteContents、CanCloseFrame相应的消息函数,点“确定”即可。
点开111Doc.cpp文件,里面有相应的消息映射函数定义位置,在函数CMy111Doc::CMy111Doc()里输入以下代码:
m_refColorBKG=0x00808080;
m_hDIB=NULL;
m_palDIB=NULL;
m_sizeDoc=CSize(1,1);
在函数CMy111Doc::~CMy111Doc()里输入以下代码:
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL)m_hDIB);

if(m_palDIB!=NULL)
delete m_palDIB;
在函数BOOL CMy111Doc::OnOpenDocument(LPCTSTR lpszPathName)里/ TODO: Add your specialized creation code here下面添加如下代码:
CFile file;
CFileException fe;

if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);

return FALSE;
}

DeleteContents();

BeginWaitCursor();

TRY
{
m_hDIB=::ReadDIBFile(file);
}
CATCH(CFileException,eLoad)
{
file.Abort();

EndWaitCursor();

ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);

m_hDIB=NULL;

return FALSE;
}
END_CATCH

InitDIBData();

EndWaitCursor();

if(m_hDIB==NULL)
{
CString strMsg;
strMsg="读取图像时出错!可能是不支持该类型的图像文件!";

MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);

return FALSE;
}

SetPathName(lpszPathName);

SetModifiedFlag(FALSE);
在函数BOOL CMy111Doc::OnSaveDocument(LPCTSTR lpszPathName)里// TODO: Add your specialized code here and/or call the base class后面添加如下代码:
CFile file;
CFileException fe;

if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);

return FALSE;
}

BOOL bSuccess=FALSE;

TRY
{
BeginWaitCursor();

bSuccess=::SaveDIB(m_hDIB,file);

file.Close();
}
CATCH(CException,eSave)
{
file.Abort();

EndWaitCursor();

ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);

return FALSE;
}
END_CATCH

EndWaitCursor();

SetModifiedFlag(FALSE);

if(!bSuccess)
{
CString strMsg;
strMsg="无法保存BMP图像";

MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);

}
点开ClassView,右键点击CMy111Doc类,点Add Member Variable出现添加成员变量对话框,在Variable Type下的框中输入变量类型名HDIB,在Variable Name中输入变量名m_hDIB,在Access中选中Public就在CMy111Doc中加入了公共成员变量m_hDIB;同样加入int类型的m_nColorIndex、COLORREF类型的m_refColorBKG公共成员变量,再添加保护成员变量(在Access中选中Protected)CSize类的m_sizeDoc、CPalette*类的m_palDIB变量。右键点击CMy111Doc类,点Add Member Function出现添加成员函数对话框,在Function Type下的框中输入函数类型名void,在Function Declaration中输入函数名InitDIBData(),在Access中选中Public就在CMy111Doc中加入了公共成员函数InitDIBData();同样方法加入void类型的公共成员函数ReplaceHDIB(HDIB hDIB)。在111Doc.cpp中加入函数的代码,InitDIBData()里加如下代码:
if(m_palDIB!=NULL)
{
delete m_palDIB;

m_palDIB=NULL;
}

if(m_hDIB==NULL)
return;

LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);

if(::DIBWidth(lpDIB)>INT_MAX||::DIBHeight(lpDIB)>INT_MAX)
{
::GlobalUnlock((HGLOBAL)m_hDIB);

::GlobalFree((HGLOBAL)m_hDIB);

m_hDIB=NULL;

CString strMsg;
strMsg="BMP图像太大!";

MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);

return;
}

m_sizeDoc=CSize((int)::DIBWidth(lpDIB),(int)::DIBHeight(lpDIB));

::GlobalUnlock((HGLOBAL)m_hDIB);

m_palDIB=new CPalette;

if(m_palDIB==NULL)
{
::GlobalFree((HGLOBAL)m_hDIB);

m_hDIB=NULL;

return;
}

if(::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)
{
delete m_palDIB;

m_palDIB=NULL;

return;
}
在函数ReplaceHDIB(HDIB hDIB)中加入如下代码:
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL)m_hDIB);

m_hDIB=hDIB;

在CMy111doc.h的
// Attributes
public:
下面加入如下代码:
HDIB GetHDIB() const
{
return m_hDIB;
}

CPalette* GetDocPalette() const
{
return m_palDIB;
}

CSize GetDocSize() const
{
return m_sizeDoc;
}
注意要在111Doc.h前加上#include "DIBAPI.h"语句(在class CMy111Doc:public CDocument语句前)
下面为CMy111View中的函数 void CMy111View::OnDraw(CDC* pDC)中添加如下代码:
BeginWaitCursor();
CMy111* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
HDIB hDIB=pDoc->GetHDIB();

if(hDIB!=NULL)
{
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);

int cxDIB=(int)::DIBWidth(lpDIB);
int cyDIB=(int)::DIBHeight(lpDIB);

::GlobalUnlock((HGLOBAL)hDIB);

CRect rcDIB;
rcDIB.top=rcDIB.left=0;
rcDIB.right=cxDIB;
rcDIB.bottom=cyDIB;

CRect rcDest;

if(pDC->IsPrinting())
{
int cxPage=pDC->GetDeviceCaps(HORZRES);
int cyPage=pDC->GetDeviceCaps(VERTRES);

int cxInch=pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch=pDC->GetDeviceCaps(LOGPIXELSY);

rcDest.top=rcDest.left=0;
rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)/((double)cxDIB*cxInch));
rcDest.right=cxPage;

int temp=cyPage-(rcDest.bottom-rcDest.top);
rcDest.bottom+=temp/2;
rcDest.top+=temp/2;
}
else
{
rcDest=rcDIB;
}

::PaintDIB(pDC->m_hDC,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());
}
EndWaitCursor();
以上是关于图像打开、显示、保存的有关步骤和代码。

在111.cpp文件的InitInstance()函数的ParseCommandLine(cmdInfo);语句下输入语句
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
则启动时不自动打开一个空文档。

显示图像直方图步骤:
1、 点击ResourceView,右键点击Dialog,选Insert Dialog 在属性对话框中将ID改为ID_HIST,对话框名称改为“直方图”
2、 在工具栏中点“插入”-“新建类”,输入类名,并选Base Class为CDialog,Dialog ID为ID_HIST。这样就将对话框和类联系起来了,在该对话框中拖入一Edit控件,将其ID设为IDC_HISTSHOW;
3、 快捷键“Ctrl+W”,出现MFC ClassWizard对话框,在Messages栏中分别选WM_INITDIALOG和WM_Paint,再点击“Add Function”,即将对话框初始化和画图函数加入对话框类之中。
4、 在Hist.h文件“public:”下面输入如下变量定义:
LONG m_lCount[256];
char* m_lpDIBBits;
LONG m_lWidth;
LONG m_lHeight;
int m_iIsDraging;
CDlgIntensity(CWnd* pParent = NULL);
5、 打开Hist.cpp程序,在CHist::OnInitDialog()函数中“// TODO: Add extra initialization here”前将如下代码拷贝进去:
unsigned char* lpSrc;
LONG i;
LONG j;
6、 在“// TODO: Add extra initialization here”后将如下代码拷贝进去:
CWnd* pWnd=GetDlgItem(IDC_HISTSHOW);

CRect rect;
GetClientRect(rect);
ClientToScreen(&rect);

for(i=0;i<256;i++)
{
m_lCount[i]=0;
}

LONG lLineBytes;

lLineBytes=WIDTHBYTES(m_lWidth*8);

for(i=0;i<m_lHeight;i++)
{
for(j=0;j<m_lWidth;j++)
{
lpSrc=(unsigned char*)m_lpDIBBits+lLineBytes*i+j;

m_lCount[*(lpSrc)]++;
}
}

m_iIsDraging=0;
7、在CHist::OnPaint()函数“CPaintDC dc(this);”前将如下代码拷如其中:
CString str;
LONG i;
LONG lMaxCount=0;
LONG m_iLowGray=0;
LONG m_iUpGray=255;
在CHist::OnPaint()函数“// TODO: Add your message handler code here”后将如下代码拷如其中:
CWnd* pWnd=GetDlgItem(IDC_ HISTSHOW);

CDC* pDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();

pDC->Rectangle(0,0,330,300);

CPen* pPenRed=new CPen;

pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));

CPen* pPenBlue=new CPen;

pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255));

CPen* pPenGreen=new CPen;

pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));

CGdiObject* pOldPen=pDC->SelectObject(pPenRed);

pDC->MoveTo(10,10);

pDC->LineTo(10,280);

pDC->LineTo(320,280);

str.Format("0");
pDC->TextOut(10,283,str);
str.Format("50");
pDC->TextOut(60,283,str);
str.Format("100");
pDC->TextOut(110,283,str);
str.Format("150");
pDC->TextOut(160,283,str);
str.Format("200");
pDC->TextOut(210,283,str);
str.Format("255");
pDC->TextOut(265,283,str);

for(i=0;i<256;i+=5)
{
if((i&1)==0)
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,284);
}
else
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,282);
}
}

pDC->MoveTo(315,275);
pDC->LineTo(320,280);
pDC->LineTo(315,285);

pDC->MoveTo(10,10);
pDC->LineTo(5,15);
pDC->MoveTo(10,10);
pDC->LineTo(15,15);

for(i=m_iLowGray;i<=m_iUpGray;i++)
{
if(m_lCount[i]>lMaxCount)
{
lMaxCount=m_lCount[i];
}
}

pDC->MoveTo(10,25);
pDC->LineTo(14,25);
str.Format("%d",lMaxCount);
pDC->TextOut(11,26,str);

pDC->SelectObject(pPenGreen);

pDC->MoveTo(m_iLowGray+10,25);
pDC->LineTo(m_iLowGray+10,280);

pDC->MoveTo(m_iUpGray+10,25);
pDC->LineTo(m_iUpGray+10,280);

pDC->SelectObject(pPenBlue);

if(lMaxCount>0)
{
for(i=m_iLowGray;i<=m_iUpGray;i++)
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,281-(int)(m_lCount[i]*256/lMaxCount));
}
}

pDC->SelectObject(pOldPen);

delete pPenRed;
delete pPenBlue;
delete pPenGreen;

8、点开ResourceView中的Menu,出现IDR_MAINFRAME和 IDR_MY111TYPE,双击IDR_MY111TYPE就出现了程序界面,有文件、编辑、查看、窗口、帮助按钮。点“查看”下面的虚线框右键——点“属性”,输入标题(直方图),和ID(大写英文,如ID_VIEW_HIST),这样就将按钮和程序通过ID联系起来了,点击该按钮,就会执行相应的程序。下面为该按钮添加函数:点Ctrl+W ,出现MFC ClassWizard对话框,选Class name为CMy111View,在Object IDs对应的选项中选中设置的ID(如为ID_VIEW_HIST),在Messages选项中选中COMMAND,然后点击“Add Function”按钮,选默认设置,就为ID_VIEW_HIST添加了相应的函数OnViewHist()。该函数在111View.cpp文件中定义,在函数void CMy111View:: OnViewHist()添加如下代码:
// TODO: Add your command handler code here
CMy111Doc* pDoc=GetDocument();

if(pDoc->m_hDIB==NULL)
{
MessageBox("请先打开一幅256色的BMP图像!","系统提示",MB_ICONINFORMATION|MB_OK);
return;
}

LPSTR lpDIB;
LPSTR lpDIBBits;

lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());

lpDIBBits=::FindDIBBits(lpDIB);

if(::DIBNumColors(lpDIB)!=256)
{
MessageBox("目前只支持查看256色位图灰度直方图!","系统提示",MB_ICONINFORMATION|MB_OK);

::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());

return;
}

BeginWaitCursor();

CHist dlgPara;

dlgPara.m_lpDIBBits=lpDIBBits;
dlgPara.m_lWidth=::DIBWidth(lpDIB);
dlgPara.m_lHeight=::DIBHeight(lpDIB);
// dlgPara.m_iLowGray=0;
// dlgPara.m_iUpGray=255;

if(dlgPara.DoModal()!=IDOK)
{
return;
}

::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());

EndWaitCursor();

Ⅵ 萝卜圈机器人汽车总动员程序怎么编,怎样实现沿着路走,灰度,红外传感器之类的怎么用求

红外感应式找加分物,灰度是感应路面的,走路是红外射到墙壁上,沿路走。要很多设置,好好学吧。分看着给吧

Ⅶ 关于机器人地面灰度传感器的问题

有较大的差别,但要在有一定亮度的白光照射下,不要有阴影。

Ⅷ 格物斯坦 三灰度传感器怎样编程

 
1、节气门位置传感器 
作用:节气门位置传感器是监测节气门开启角度的大小,确定怠速,全负荷及加减速工况,以实施与节气门开度状态
相对应的各种喷油量控制。失效影响:怠速忽高忽低,或造成飞车现象。 

2、进气门压力传感器 
作用:进气压力传感器是提供发动机负荷信息,即通
遇对进气管的压力测量,间接测量进入发动机的进气量,再通过内部电路使进气量转化成电信号提供给电脑。失效影响:造成发动机不易起动,或怠速不稳。 

3、进气温度传感器 
作用:提供空气温度信息用于修正喷油量和点火正时。 失效影响:怠速偏低,易熄火。 

4、曲轴转角传感器 
作用:是提供转速和曲轴相位信息,为喷油正时和点火正时提供参照点。失效影响:发动机不能起动或起动后发动机突然熄火。 

5、冷却液温度传感器 
作用:是监测发动机冷却液温度,将之转换为电压信号传送到电脑,ECU根据此信号来控制喷油量,点火正时和怠速控制。 失效影响:怠速偏低。 

6、氧传感器 
作用:是提供混合器浓度信息,用于修正喷油量,实现对空燃比的闭环控制,保证发动机实际的空燃比接近理论空燃比的主要元件。 失效影响:怠速不稳,耗量过大。 

7、爆震传感器 
作用:是提供爆震信息,用于修正点火正时,实引爆震闭环控制。 失效影响:当爆震将要发生前无法提供爆震信点,电脑接收不到信号“峰值”不能减少点火提前角,而发生爆震。 

8、三元催化器 
作用:三元催化器装在排气管中的消声器前,可同时降低尾气中三种污染物(一氧化碳CO、未燃碳氧化合物HC和氧化物Nox的含量,发动机的空燃比接近理论空燃比时,三元催化器转化效率最高,当有害气体的300℃~800℃的高温通过三元催化器中心经附在陶瓷单体上的贵重催化发生氧化和还原反应,转化为无害气体。 失效影响:排出的废气不能达标。

Ⅸ 怎么做小型简单的机器人。。。

我想请问··你所说的··自己做是指的什么呢?是指自己买零件来搭建···还是·说完全靠自己一个一个零件做出来··
好吧··其实我觉得后面那个想法对于一个初中生来说几乎是不可能的事。我们在大学都还是买来的零件··如果你真的要自己做的话··呃·先学好初中基本电路知识吧··然后你以后要学单片机··学传感器原理··还要学控制·学编程···道路是曲折的·前途是光明的··呵呵
对于前一个想法,还是可以实现的··首先·你要有一块主板··可以是乐高上拆下来的··可以是其他公司上机器人(比如:广茂达··的)·拆下来的·可以直接到网上买一块主板··然后··你要想好··你想要搭建一个什么样的机器人··主要是你想要让你的机器人实现一个什么功能··比如··你想要你的机器人·沿白色曲线·行走··那么你就需要一个灰度传感器·(光感器··用来测颜色的·)连接上你的主板·通过程序来控制···或者你想要制造一个··寻找光源的·机器人··在黑暗中·会自动移动到光源处··那么你需要几个电机··一块控制主板··一个光感器·加一套程序··收工··
呃·如果你认为·小型简单的机器人·就是一个会移动的·机器的话··那还是去买个·四驱车吧···机器人·之所以称为机器人··我觉得主要的·是它能实现人们想要它实现的功能··
其实··我认为·如果·真的对这方面·很感兴趣的话·对于一个初中生·还是学好各方面知识先吧··然后·上一个·有机器人兴趣小组的高中··最好是有老师带的·能代表学校去参赛的·那样会学到很多东西·的··也会交到很多·有同样兴趣的朋友··我的高中就是这样过的··提前接触这些知识·对以后上大学也很有帮助··
就这些了··还有问题留言··

热点内容
线切割怎么导图 发布:2021-03-15 14:26:06 浏览:709
1台皮秒机器多少钱 发布:2021-03-15 14:25:49 浏览:623
焊接法兰如何根据口径配螺栓 发布:2021-03-15 14:24:39 浏览:883
印章雕刻机小型多少钱 发布:2021-03-15 14:22:33 浏览:395
切割机三五零木工貝片多少钱 发布:2021-03-15 14:22:30 浏览:432
加工盗砖片什么榉好 发布:2021-03-15 14:16:57 浏览:320
北洋机器局制造的银元什么样 发布:2021-03-15 14:16:52 浏览:662
未来小七机器人怎么更新 发布:2021-03-15 14:16:33 浏览:622
rexroth加工中心乱刀怎么自动调整 发布:2021-03-15 14:15:05 浏览:450
机械键盘的键帽怎么选 发布:2021-03-15 14:15:02 浏览:506