求一个控制摄像头小程序的源码,要求VC下编译运行

求一个控制摄像头小程序的源码,要求VC下编译运行,第1张

VC-摄像头控制SDK源码

#include <windows.h>

#include <stdio.h>

#include <vfw.h>

#pragma comment(lib,"vfw32.lib")

HWND ghWndCap //捕获窗的句柄

CAPDRIVERCAPS gCapDriverCaps //视频驱坦铅动器的能力

CAPSTATUS gCapStatus //捕获窗的状态

char szCaptureFile[] = "MYCAP.AVI"

char gachBuffer[20]

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)

LRESULT CALLBACK StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)

{

if(!ghWndCap)return FALSE//获得捕获窗的状态

capGetStatus(ghWndCap,&gCapStatus,sizeof(CAPSTATUS))//更新捕获窗的大小

SetWindowPos(ghWndCap,NULL,0,0,gCapStatus.uiImageWidth,gCapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE)

if(nID==0){//清除旧的状态信息

SetWindowText(ghWndCap,(LPSTR)"hello")

return (LRESULT)TRUE

}//前笑显示状态ID和状态文本

wsprintf(gachBuffer,"Status# %d: %s",nID,lpStatusText)

SetWindowText(ghWndCap,(LPSTR)gachBuffer)

return (LRESULT)TRUE

}

LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)

{

if(!ghWndCap)return FALSE

if(nErrID==0)return TRUE//清除旧的错误

wsprintf(gachBuffer,"Error# %d",nErrID)//显示错误标识和文本

MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION)

return (LRESULT) TRUE

}

LRESULT CALLBACK FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr)

{

FILE *fp

fp=fopen("caram.dat","w")

if(!ghWndCap)return FALSE/让悔好/假设fp为一打开的.dat文件指针

fwrite(lpVHdr->lpData,1,lpVHdr->dwBufferLength,fp)

return (LRESULT)TRUE

}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)

{

static TCHAR szAppName[]=TEXT("HelloWin")

HWND hwnd

MSG msg

WNDCLASS wndclass

wndclass.style=CS_HREDRAW|CS_VREDRAW

wndclass.lpfnWndProc=WndProc

wndclass.cbClsExtra=0

wndclass.cbWndExtra=0

wndclass.hInstance=hInstance

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION)

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW)

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH)

wndclass.lpszMenuName=NULL

wndclass.lpszClassName=szAppName

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("This program requires WindowsNT!"),szAppName,MB_ICONERROR)

return 0

}

hwnd=CreateWindow(szAppName,TEXT("The Hello Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL)

ShowWindow(hwnd,iCmdShow)

UpdateWindow(hwnd)

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

return msg.wParam

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

HDC hdc

PAINTSTRUCT ps

RECT rect

switch(message)

{

case WM_CREATE:

{

ghWndCap=capCreateCaptureWindow((LPSTR)"Capture Window",WS_CHILD|WS_VISIBLE,0,0,300,240,(HWND)hwnd,(int)0)

capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc)

capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc)

capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc)

capDriverConnect(ghWndCap,0)// 将捕获窗同驱动器连接

//获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中

capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS))

capPreviewRate(ghWndCap, 66)// 设置Preview模式的显示速率

capPreview(ghWndCap, TRUE)//启动Preview模式

if(gCapDriverCaps.fHasOverlay) //检查驱动器是否有叠加能力

capOverlay(ghWndCap,TRUE)//启动Overlay模式

if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap)//Video source 对话框

if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap)// Video format 对话框

if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap)// Video display 对话框

capFileSetCaptureFile( ghWndCap, szCaptureFile)//指定捕获文件名

capFileAlloc(ghWndCap, (1024L * 1024L * 5))//为捕获文件分配存储空间

capCaptureSequence(ghWndCap)//开始捕获视频序列

capGrabFrame(ghWndCap)//捕获单帧图像

}

return 0

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

GetClientRect(hwnd,&rect)

DrawText(hdc,TEXT("Hello,Windows98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER)

EndPaint(hwnd,&ps)

return 0

case WM_DESTROY:

{

capSetCallbackOnStatus(ghWndCap,NULL)

capSetCallbackOnError(ghWndCap,NULL)

capSetCallbackOnFrame(ghWndCap,NULL)

capCaptureAbort(ghWndCap)//停止捕获

capDriverDisconnect(ghWndCap)//将捕获窗同驱动器断开

PostQuitMessage(0)

}

return 0

}

return DefWindowProc(hwnd,message,wParam,lParam)

}

现在有很多场景需要用到预约类小程序,例如家政服务、摄影、美业、课程学习小程序依托于微信十亿流量的平台,方便快捷、用完即走的特点,让它给服务行业带来了很大的变化。在小程序中查看服务信息,选择服务,这给商家和客户都带来很大便利,既节约了用户等待时间,也方便商家管理。

预约类小程序这么有用,很多服务行业的企业和商家也有了制作自己的小程序的想法,于是纷纷去找简单微信小程序代码,其实这是完全不必要的。现在制作小程序的方法有很多,即使是不懂代码的小白,也能快速生成自己的小程序了。下面就跟大家科普下无需预约小程序源码,就能快速制作小程序的方法。

对于不懂代码的小白来说,目前常用的制作方式是使用零代码小程序制作工具。现在市面上这样的工具很多,但质量良莠不齐,你得从多个方面考虑,包括小程序的模板设计质量、技术团队水平、过往案例效果、功能是否丰富、业界口碑等等。

选孙历好工具后,你就可以制作自己的小程序了。这个过程也很简单,接下来我以「上线了」小程序制作工具为例,给大家演示下如何制作:注册账号后选择“创建小程序”,再选择“服务预订”类别。

然后你会看到一个模板选择页面,选一个喜欢的模板,进入编辑后台。在这里,你可以添加自己的服务项目、服务握困人员、服务分类。在“预约设置”里你可以设置自己的预约时间、预约人数。

在“则皮搜风格”里你可以设置小程序的主题色、商品布局模式,添加轮播图,让自己的小程序更具个性化。此外你还能在“功能组件”里开通关联公众号功能,形成自媒体营销闭环,培养稳定的粉丝群体。

做好后点击左下角“立即发布”,按照提示用小程序管理员账号扫描授权(如果没有小程序账号,按照系统提示快速注册一个即可),就大功告成了。

class BaiDuAiBaseController extends BaseController

{

private $appid

private $appKey

private $secretKey

public function __construct(){

$this->appid= config('api.baidu.appid')

$this->appKey = config('api.baidu.apikey')

$this->secretKey = config('api.baidu.secretkey')

}

//百度ai接口--文字识别--车牌号识别

public function getCarNumber($_imgurl,$_img=''){

$_token = $this->getToken()

$_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?access_token='.$_token

if($_img){

$_data = [

'image'=>$_img//图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式

]

}else{

$_data = [

'url'=>request()->domain().'/'.$_imgurl

]

}

$_res = json_decode(httpGet($_url,$_data),true)

/庆穗/TODO 此处只返回false没有终止,是因为程序执行流程需要,后期可能要改

if(isset($_res['error_msg'])) return false

return $_res['words_result']['number']

}

//获取token

private function getToken(){

if(cache('baidu_token')){

$_access_token = cache('baidu_token')

}else{

$_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='.$this->appKey.'&client_secret='.$this->secretKey

$res = json_decode(httpGet($_url),true)

if(isset($res['error']))TApiException($res['error_description'])//终止程序并抛出异常

$_access_token = $res['access_token']

$_expires_in = $res['粗轮expires_in']

cache('baidu_token',$_access_token,($_expires_in-1000))//我喜欢少存1000秒,没有为什么,问就是癖好

}

return $_access_token

}

}

这是ThinkPhp5.1后端封装的百度AI接口类,getToken()获取凭证,getCarNumber()请求$_url 返回识别结果,这个是车牌号码识岩差信别,车型识别等其他接口大部分都一样,就换个请求地址$_url就行

//接口:

public function getImgCarNum(){

$_number = (new BaiDuAiBaseController())->getCarNumber(false,request()->param('img'))

return self::myShow('申请成功',['carNum'=>$_number])

}

小程序端正常request请求上面的接口就行,下面是微信小程序拍照识别功能

//拍照

goImgSearch(){

uni.chooseImage({

count:1,

sizeType: ['compressed'],//original 原图,compressed 压缩图

sourceType: ['album','camera'],//camera 相机 album相册

success:(r)=>{

console.log(r)

//执行识别车牌号码

this.img = r.tempFilePaths[0]

this.urlTobase64(r.tempFilePaths[0])

}

})

},

//识别车牌号码

urlTobase64(url){

uni.showLoading({

title:'拼命识别车牌中..'

})

//#ifdef MP-WEIXIN

uni.getFileSystemManager().readFile({

filePath: url, //选择图片时返回的路径

encoding: "base64",//这个是很重要的

success: res =>{ //成功的回调

//返回base64格式

let base64 = 'data:image/jpegbase64,' + res.data

//发送请求,识别车牌号码

this.$H.post('/getImgCarNum',{

img:base64 //图片数据

},{

token:true //必须登录

}).then((res)=>{

console.log(res.carNum)

if(!res.carNum){

uni.hideLoading()

return uni.showModal({

title:'识别失败',

content:'没能识别到车牌号码,请拍张清晰的图片再试哦,谢谢',

showCancel:false

})

}

uni.showToast({

title:'识别车牌成功',

icon:'none'

})

this.searchUser = res.carNum

this.userCarNum = res.carNum

uni.hideLoading()

}).catch((e)=>{

uni.hideLoading()

return uni.showModal({

title:'识别失败',

content:'没能识别到车牌号码,请拍张清晰的图片再试哦,谢谢',

showCancel:false

})

})

},

fail:(e)=>{

console.log(e)

}

})

//#endif

},


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12406688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存