- 博客(0)
- 资源 (4)
- 收藏
- 关注
OpenCV + zbar开源库实现摄像头识别二维码
OpenCV+zbar开源库实现摄像头识别二维码,测试验证识别率非常高,已实现简单的应用。
打包源码在VS2013下可以完全编译成功,附加包含OpenCV库及zbar-0.10-setup.exe,zbar-0.10.tar.bz2
下载Demo后需要安装 zbar-0.10-setup.exe
以下代码可以可以完成整个流程的开发,也可以贡献积分下载资源包。
1、 环境准备
(1) OpenCV库2.49
(2) ZBar开源库
(3) VS2013
2、 VS2013环境配置
(1) 配置附加包含目录 C/C++ -- 附加包含目录
include\opencv\include\
include\opencv\include\opencv
include\opencv\include\opencv2
include
(2) 配置链接器 链接器 -- 附加库目录
lib32\opencv\lib
lib32
(3) 配置链接器 链接器--输入--附加依赖项
opencv_core249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
libzbar-0.lib
3、 代码开发
(1)包含头文件
include
include
include
include
include
include
using namespace std;
using namespace zbar;
using namespace cv;
(2)实现函数
void MatToCImage(cv::Mat &mat, CImage &cImage)
{
//create new CImage
int width = mat.cols;
int height = mat.rows;
int channels = mat.channels();
cImage.Destroy(); //clear
cImage.Create(width, height, 8 * channels); //默认图像像素单通道占用1个字节
//copy values
uchar* ps;
uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer
int step = cImage.GetPitch();
for (int i = 0; i (i));
for (int j = 0; j GetDlgItem(IDC_STATIC_IMG)->GetClientRect(▭);
cv::VideoCapture capture(0);//从摄像头读入图像
while (!m_bCloseCamera)
{
cv::Mat frame;
capture >> frame;
cv::Mat newframe;
cv::Size ResImgSiz = cv::Size(rect.Width(), rect.Height());
cv::resize(frame, newframe, ResImgSiz, CV_INTER_CUBIC);
MatToCImage(newframe, imgDst);
imgDst.Draw(pThis->GetDlgItem(IDC_STATIC_IMG)->GetDC()->GetSafeHdc(), rect);
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
Mat imageGray;
cvtColor(frame, imageGray, CV_RGB2GRAY);
int width = imageGray.cols;
int height = imageGray.rows;
uchar *raw = (uchar *)imageGray.data;
Image imageZbar(width, height, "Y800", raw, width * height);
scanner.scan(imageZbar); //扫描条码
Image::SymbolIterator symbol = imageZbar.symbol_begin();
if (imageZbar.symbol_begin() == imageZbar.symbol_end())
{
}
else
{
iIndex++;
if (iIndex > 999999)
{
iIndex = 0;
}
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
char szInfo[1024];
memset(szInfo, 0, sizeof(szInfo));
sprintf(szInfo, "[d]类型:%s\r\n条码:%s\r\n", iIndex , symbol->get_type_name().c_str(), symbol->get_data().c_str());
pThis->GetDlgItem(IDC_EDIT1)->SetWindowText(szInfo);
}
}
imageZbar.set_data(NULL, 0);
}
imgDst.Destroy();
capture.release();
return 0;
}
2020-04-06
C++串口通信类,华中科技大学编写并有多方面应用
呈上头文件部分信息 注释的也很详细的
COPYRIGHT NOTICE
Copyright c 2009 华中科技大学tickTick Group (版权声明)
All rights reserved
@file SerialPort h
@brief 串口通信类头文件
本文件完成串口通信类的声明
@version 1 0
@author 卢俊
@E mail:lujun hust@gmail com
@date 2010 03 19
修订说明:
#ifndef SERIALPORT H
#define SERIALPORT H
#include <Windows h>
串口通信类
本类实现了对串口的基本操作
例如监听发到指定串口的数据 发送指定数据到串口
class CSerialPort
{
public:
CSerialPort void ;
CSerialPort void ;
public:
初始化串口函数
@param: UINT portNo 串口编号 默认值为1 即COM1 注意 尽量不要大于9
@param: UINT baud 波特率 默认为9600
@param: char parity 是否进行奇偶校验 "Y"表示需要奇偶校验 "N"表示不需要奇偶校验
@param: UINT databits 数据位的个数 默认值为8个数据位
@param: UINT stopsbits 停止位使用格式 默认值为1
@param: DWORD dwCommEvents 默认为EV RXCHAR 即只要收发任意一个字符 则产生一个事件
@return: bool 初始化是否成功
@note: 在使用其他本类提供的函数前 请先调用本函数进行串口的初始化
n本函数提供了一些常用的串口参数设置 若需要自行设置详细的DCB参数 可使用重载函数
n本串口类析构时会自动关闭串口 无需额外执行关闭串口
@see:
bool InitPort UINT portNo 1 UINT baud CBR 9600 char parity "N" UINT databits 8
UINT stopsbits 1 DWORD dwCommEvents EV RXCHAR ;
串口初始化函数
本函数提供直接根据DCB参数设置串口参数
@param: UINT portNo
@param: const LPDCB & plDCB
@return: bool 初始化是否成功
@note: 本函数提供用户自定义地串口初始化参数
@see:
bool InitPort UINT portNo const LPDCB& plDCB ;
开启监听线程
本监听线程完成对串口数据的监听 并将接收到的数据打印到屏幕输出
@return: bool 操作是否成功
@note: 当线程已经处于开启状态时 返回flase
@see:
bool OpenListenThread ;
关闭监听线程
@return: bool 操作是否成功
@note: 调用本函数后 监听串口的线程将会被关闭
@see:
bool CloseListenTread ;
向串口写数据
将缓冲区中的数据写入到串口
@param: unsigned char pData 指向需要写入串口的数据缓冲区
@param: unsigned int length 需要写入的数据长度
@return: bool 操作是否成功
@note: length不要大于pData所指向缓冲区的大小
@see:
bool WriteData unsigned char pData unsigned int length ;
获取串口缓冲区中的字节数
@return: UINT 操作是否成功
@note: 当串口缓冲区中无数据时 返回0
@see:
UINT GetBytesInCOM ;
读取串口接收缓冲区中一个字节的数据
@param: char & cRecved 存放读取数据的字符变量
@return: bool 读取是否成功
@note:
@see:
bool ReadChar char &cRecved ;
private:
打开串口
@param: UINT portNo 串口设备号
@return: bool 打开是否成功
@note:
@see:
bool openPort UINT portNo ;
关闭串口
@return: void 操作是否成功
@note:
@see:
void ClosePort ;
串口监听线程
监听来自串口的数据和信息
@param: void pParam 线程参数
@return: UINT WINAPI 线程返回值
@note:
@see:
static UINT WINAPI ListenThread void pParam ;
private:
串口句柄
HANDLE m hComm;
线程退出标志变量
static bool s bExit;
线程句柄
volatile HANDLE m hListenThread;
同步互斥 临界区保护
CRITICAL SECTION m csCommunicationSync; < 互斥操作串口
};
#endif SERIALPORT H ">呈上头文件部分信息 注释的也很详细的
COPYRIGHT NOTICE
Copyright c 2009 华中科技大学tickTick Group (版权声明)
All rights reserved
@file SerialPort h
@brief [更多]
2014-05-03
SQLite封装类的实现及附带使用说明
SQLite封装的数据库实现类 可以方便使用和调用接口 附带详细的调用说明 只使用C++ MFC
创建数据库
CppSQLite3DB db;
CFileFind fFind;
if fFind FindFile T "dataAcquisition 1 db"
{
db open T "dataAcquisition MagneticDataAcquisition db" NULL ; 创建文件
1#磁钢波峰数据
db execDML T "CREATE TABLE MagDate 1 CarID TEXT 30
AlxID INT 2 SamplingValue INT 2 Spleed INT 2 Degree INT 2 ;" ;
2#磁钢波峰数据
db execDML T "CREATE TABLE MagDate 2 CarID TEXT 30
AlxID INT 2 SamplingValue INT 2 Spleed INT 2 Degree INT 2 ;" ;
3#磁钢波峰数据
db execDML T "CREATE TABLE MagDate 3 CarID TEXT 30
AlxID INT 2 SamplingValue INT 2 Spleed INT 2 Degree INT 2 ;" ;
4#磁钢波峰数据
db execDML T "CREATE TABLE MagDate 4 CarID TEXT 30
AlxID INT 2 SamplingValue INT 2 Spleed INT 2 Degree INT 2 ;" ;
列车采样信息汇总 1# 2#磁钢得到的数据
db execDML T "CREATE TABLE TrainNode 12 TrainID TEXT 30 AlxNums 1 INT 2 AlxNums 2 INT 2 MaxSpleed INT 2 MinSpleed INT 2 AvgSpleed INT 2 SpleedDegree INT 2 MaxWaveSamp 1 INT 2 MinWaveSamp 1 INT 2 AvgWaveSamp 1 INT 2 MaxWaveSamp 2 INT 2 MinWaveSamp 2 INT 2 AvgWaveSamp 2 INT 2 YouXiao TEXT 2 ;" ;
列车采样信息汇总 3# 4#磁钢得到的数据
db execDML T "CREATE TABLE TrainNode 34 TrainID TEXT 30 AlxNums 3 INT 2 AlxNums 4 INT 2 MaxSpleed INT 2 MinSpleed INT 2 AvgSpleed INT 2 SpleedDegree INT 2 MaxWaveSamp 3 INT 2 MinWaveSamp 3 INT 2 AvgWaveSamp 3 INT 2 MaxWaveSamp 4 INT 2 MinWaveSamp 4 INT 2 AvgWaveSamp 4 INT 2 YouXiao TEXT 2 ;" ;
磁钢故障报警记录
db execDML T "CREATE TABLE GuZhangInfo TrainID TEXT 30 MagNetID INT 2 GuZhangName TEXT 100 ;" ;
列车速度最终值用于存储 可实现用户更改
db execDML T "CREATE TABLE SpleedDegree DegreeID INT 2 AvgWaveSamp 1 INT 2 AvgWaveSamp 2 INT 2 AvgWaveSamp 3 INT 2 AvgWaveSamp 4 INT 2 ;" ;
插入预先准备好的数据
for int i 0;i<m GlobalPublicManager m MaxSpleedDegree;i++
{
CString
2013-11-28
汉字点阵生成源码 两种方式生成 适合新手学习
本例题采用两种方式列举了汉字取模方法,并用图像生动的显示出来,可以说是新手学习的好例题。
1.以16点阵汉字取模方式 通过定位读取 HZK16 文件(源码内附带这个文件,可以不用下载了)方式,详细说明实现方法。
2.通过GetGlyphOutline这个函数实现,用户可以手动选择Windows自带的字体,然后根据字体生成相应的数组,最后绘制数组显示。
以上源码楼主测试,在VC6.0下完全通过,可直接运行。
以上代码仍有很多不足之处,请大家留言指正哈.
关键代码:
BOOL CPixFontTranDlg::GetGridFromHZK16(CString strFont,BYTE buffer[])
{
...
AnsiCode[0]=strFont.GetAt(0);
if(AnsiCode[0]GetSafeHdc(),chartemp,GGO_BITMAP,&glpm,0,NULL,&mmat2);
//根据MSDN,cbBuffer 传入参数0,则返回值是BUFFER的大小
if((signed)nLen>0)
{
....
nLentemp=::GetGlyphOutline(pdc->GetSafeHdc(),chartemp,GGO_BITMAP,&glpm,nLen,pBuf,&mmat2);//重新运行,获取BUFFER的数据,pBUF就是字符对应位图的BUFFER指针
}
...
offset=8-rows/2; //从点阵第一行到字的第一行的偏移量
for(i=0;i<rows;i++)
{
memcpy(buffer+(offset+i)*2,pBuf+i*4,2); //将得到的字的BUFFER转换为16*16点阵BUFFER
}
}
2013-06-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人