图像识别,怎么样识别一本书,长方形的;新手入门;望相助奉上100分

chary8088 2009-06-09 03:42:00
图像识别,怎么样识别一本书,长方形的;新手入门;望相助奉上100分
我想识别图片中的一本书,这个图片中只有一本书,而且书也是正面拍的,这样识别更容易,但不知道该怎么写代码,
哪位大侠给个能识别的代码,多谢谢了
...全文
262 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinfeng2005 2010-03-23
  • 打赏
  • 举报
回复
读取内存的方式,不慢的。[Quote=引用 27 楼 chary8088 的回复:]

引用 24 楼 Delphigis 的回复:
引用 20 楼 chary8088 的回复:
得到每个点的RGB值,然后比较。。。
这样应该很慢啊



不慢,很快的,检测书的话估计应该在(50ms)以内,每秒能检20本

最简单的做法:把原始图转为24位真彩格式(长和高为4的倍数),通常不用转,直接就是了
把24位bmp转成256灰度图,
得到灰度图buf,BYTE * d……
[/Quote]
yysyz0000 2010-03-15
  • 打赏
  • 举报
回复
MARK
Ryanwen 2009-06-12
  • 打赏
  • 举报
回复
......
BMP图是有结构的,给你个获取图象数据的函数吧,参数可以通过LoadBitmap函数得到,具体查看MSDN

BYTE* Get24BitPixels(HBITMAP pBitmap)
{
BITMAP bmpBmp;
LPBITMAPINFO pbmiInfo;
BITMAPINFO bmiInfo;
WORD wBmpWidth, wBmpHeight;

GetObject(pBitmap, sizeof(bmpBmp), &bmpBmp);
pbmiInfo = (LPBITMAPINFO)&bmpBmp;

wBmpWidth = (WORD)pbmiInfo->bmiHeader.biWidth;
wBmpWidth -= (wBmpWidth%4);
wBmpHeight = (WORD)pbmiInfo->bmiHeader.biHeight;

BYTE *pPixels = new BYTE[wBmpWidth*wBmpHeight*3];
if (!pPixels) return NULL;

HDC hDC =::GetWindowDC(NULL);

bmiInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiInfo.bmiHeader.biWidth = wBmpWidth;
bmiInfo.bmiHeader.biHeight = -wBmpHeight;
bmiInfo.bmiHeader.biPlanes = 1;
bmiInfo.bmiHeader.biBitCount = 24;
bmiInfo.bmiHeader.biCompression = BI_RGB;
bmiInfo.bmiHeader.biSizeImage = wBmpWidth*wBmpHeight*3;
bmiInfo.bmiHeader.biXPelsPerMeter = 0;
bmiInfo.bmiHeader.biYPelsPerMeter = 0;
bmiInfo.bmiHeader.biClrUsed = 0;
bmiInfo.bmiHeader.biClrImportant = 0;

// get pixels from the original bitmap converted to 24bits
int iRes = GetDIBits(hDC, pBitmap, 0, wBmpHeight, (LPVOID)pPixels, &bmiInfo, DIB_RGB_COLORS);

// release the device context
::ReleaseDC(NULL, hDC);

// if failed, cancel the operation.
if (!iRes)
{
delete pPixels;
return NULL;
};

// return the pixel array
return pPixels;
}

chary8088 2009-06-12
  • 打赏
  • 举报
回复
而且,lpNewDIBBits 这个里面是空的
chary8088 2009-06-12
  • 打赏
  • 举报
回复
在这个地方写入文件了,为什么不对呢?
 // 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

FILE *fpTargt = fopen("C:\\Documents and Settings\\Administrator.IBM-157A5094478\\桌面\\cn_10.bmp", "wb");
fwrite(lpDIBBits, lWidth * lHeight, 1, fpTargt);
fclose(fpTargt);

// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
Ryanwen 2009-06-12
  • 打赏
  • 举报
回复
把你的BMP图象数据指针和宽高传进去就可以了
chary8088 2009-06-12
  • 打赏
  • 举报
回复
不知道怎么使用这段代码,对图像操作以前没做过,哪位能辛苦帮忙下?
我现在已经有一张灰度化的BMP了
再开100分的帖子,以表感激之情
/*************************************************************************
*
* 函数名称:
* ThresholdDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
*
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用于对图像进行阈值分割运算:二值化
*
************************************************************************/
BOOL WINAPI ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;

// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存DIB图像的指
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
//循环变量
long i;
long j;
//像素值
unsigned char pixel;
//直方图数组
long lHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char iThreshold,iNewThreshold,iMaxGrayValue,iMinGrayValue,iMean1GrayValue,iMean2GrayValue;
//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;
//迭代次数
int iIterationTimes;
// 图像每行的字节数
LONG lLineBytes;
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}



// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}
//获得直方图
iMaxGrayValue = 0;
iMinGrayValue = 255;
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

pixel = (unsigned char)*lpSrc;

lHistogram[pixel]++;
//修改最大,最小灰度值
if(iMinGrayValue > pixel)
{
iMinGrayValue = pixel;
}
if(iMaxGrayValue < pixel)
{
iMaxGrayValue = pixel;
}
}
}
//迭代求最佳阈值
iNewThreshold = (iMinGrayValue + iMaxGrayValue)/2;
iThreshold = 0;

for(iIterationTimes = 0; iThreshold != iNewThreshold && iIterationTimes < 100;iIterationTimes ++)
{
iThreshold = iNewThreshold;
lP1 =0;
lP2 =0;
lS1 = 0;
lS2 = 0;
//求两个区域的灰度平均值
for (i = iMinGrayValue;i < iThreshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}
iMean1GrayValue = (unsigned char)(lP1 / lS1);
for (i = iThreshold+1;i < iMaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
iMean2GrayValue = (unsigned char)(lP2 / lS2);
iNewThreshold = (iMean1GrayValue + iMean2GrayValue)/2;
}
//根据阈值将图像二值化
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;

if(pixel <= iThreshold)
{
*lpDst = (unsigned char)0;
}
else
{
*lpDst = (unsigned char)255;
}
}
}
// 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
// 返回
return TRUE;
}

chary8088 2009-06-12
  • 打赏
  • 举报
回复
UP。。继续顶

sanshao27 2009-06-11
  • 打赏
  • 举报
回复
图像识别技术,没用过,帮UP
yangyi2000 2009-06-11
  • 打赏
  • 举报
回复
何斌或何东健著的书中有边缘检测的代码。。
chary8088 2009-06-11
  • 打赏
  • 举报
回复
我现在已经把图像灰度化了,,,还怎么检测
我找了Hough算法的代码,不知道哪个地方错误了。。还是不行哦
bafghgle 2009-06-11
  • 打赏
  • 举报
回复
已经有好多人给你回答了。。解决一个问题最先要搞清楚的是:你要做什么?可能的方法有哪些?较好的方法有哪些,技术难度如何,代码实现是否复杂。效率精度分析,如何充分利用先验知识。可以引入哪些技巧,怎样提取特征,设计什么样的识别算法。。。等等一些问题。。思路要有线,设计要有策略,具体开发更要有耐心,不畏难的勇气,反复调试,测试,对比效果。。一个项目完成了,学到的不仅是项目本身,更是做项目,做好事情的的思维方式方法。。有意识地锻炼自己这方面的能力吧。。
chary8088 2009-06-11
  • 打赏
  • 举报
回复
为什么一涉及到实际问题,怎么没人来回答呢。。。。!!!!!!!!!!!!!!!!!!!!!!!!
勤奋的小游侠 2009-06-11
  • 打赏
  • 举报
回复
灰度化,再二值化,因为你的是绿色书和白色背影,设好阀值做一次阀值变换就可以将两都分成黑和白了.然后再判断黑点的范围,就是书的范围.
chary8088 2009-06-11
  • 打赏
  • 举报
回复
我现在已经把图像灰度化了,,,还怎么检测
我找了Hough算法的代码,只剩检测最后一步了。。。。。
chary8088 2009-06-10
  • 打赏
  • 举报
回复
如果用点检测的话,是很简单,,估计行不通
cppzhentan 2009-06-10
  • 打赏
  • 举报
回复
角点检测来判断是否是一本书
szy41 2009-06-10
  • 打赏
  • 举报
回复
mark
chary8088 2009-06-10
  • 打赏
  • 举报
回复
得到每个点的RGB值,然后比较。。。
这样应该很慢啊
jiyougang 2009-06-10
  • 打赏
  • 举报
回复
getpixel
加载更多回复(24)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧