• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
比尔教授的学习之家
博客园    首页    新随笔    联系   管理    订阅  订阅

"ERROR: SampleCB() - buffer sizes do not match " 解决方法【转】

转载请标明转载地址。http://blog.csdn.net/jia_zhengshen/article/details/9980495

opencv的highgui模块在windows的实现中使用开源的图像显示函数库:videoInput,但是为了同Linux等兼容,highgui模块做的对PAL,NTSC模块做的不是很好,并且应该是不支持多摄像头的。通过查看源码得知,虽然ideoInput是支持多摄像头的,但是由于VideoCapture 类中的VideoInput的性质被设置为“private static ”只能有一个VideoInput实例在opencv中运行,所以opencv中不支持多摄像头,而且由于VI被设置为private所以这个VI的性质是不能更改的。

 

所以我放弃了直接使用opencv的VideoCapture模块。改为直接采用其底层的VideoInput来实现多摄像头,解决"ERROR: SampleCB() - buffer sizes do not match "问题。

做法如下:

1.下载videoinput类库,遇到问题,现在由于其不再更新,所以最高版本的类库为vs08版本,我用的是vs10 ,经过试验10的可以使用这个由vs08编译的类库。

2.设置各种路径,lib ,include路径。估计你能看到这篇文章,这点设置应该小意思。

3.包含videoinput.h头文件。

4.写代码,把videoinput类中的data直接赋值给cv::mat,或者IplImage。

qq是如何实现的呢?看看他是如何抄袭的啊

  

 

你按下“画质调节”会出现神马情况呢???????????????在运行一下下面的代码,是不是界面惊人的类似呢?原来qq也是用的videoInput这个库。

 

下面是个我写的简单的小例子,还希望大家能够指点。

 

[cpp] view plaincopy
 
  1. #pragma comment(linker,"/NODEFAULTLIB:atlthunk.lib")              
  2. //据说上面的一句话必不可少。  
  3. #include <iostream>  
  4. #include "opencv2/opencv.hpp"  
  5. #include "opencv2/gpu/gpu.hpp"  
  6. #include<opencv2\highgui\highgui.hpp>  
  7. using namespace std;  
  8. using namespace cv;  
  9. #include"videoInput.h"  
  10. int main (int argc, char* argv[])  
  11. {  
  12.     videoInput::listDevices();//列出系统能够找到的所有的摄像头  
  13.     videoInput *VI = new videoInput();  
  14.     int device =1;//设备号  
  15.     //VI->setPhyCon(0,VI_COMPOSITE);  
  16.     VI->setupDevice(device );//打开设备  
  17.     VI->setFormat(device,VI_PAL_B);//我用的摄像头是PAL_B格式的,所以设置成这个格式的,其实可以不要。  
  18.     VI->showSettingsWindow(device);//使用widows的对话框来设置摄像头的格式等。可以替代掉上面的那句话。、、打开qq的画质调节,发现你的对话框和qq的竟然一样?????  
  19.                                                         //原来qq也是用ideoInput来实现的。  
  20.     int height = VI->getHeight(device);  
  21.     int width = VI->getWidth(device );  
  22.     cout<<"height "<<height<<" width "<<width<<endl;  
  23.     IplImage *img = cvCreateImage(cvSize(width,height),8,3);  
  24.     std::cout<<VI->isDeviceSetup(device)<<std::endl;//查看设备是否启动  
  25.     std::cout<<VI->isFrameNew(device)<<std::endl;  
  26.     std::cout<<VI->getDeviceName(device)<<std::endl;//得到设备名称。  
  27.     std::cout<<VI->devicesFound<<std::endl;//一共有多少个设备。  
  28.     int i=0;  
  29.     //OPENCV C++ INTERFACE   
  30.     Mat cmat;  
  31.     cmat.create(height,width,CV_8UC3);  
  32.     Mat cmat2;  
  33.     cmat2.create(width,height,CV_8UC3);  
  34.     while(1)  
  35.     {  
  36.         //while(!VI->isFrameNew(0))  
  37.             //cout<<i++;  
  38.   
  39.         if(VI->isFrameNew(device) )  
  40.         {  
  41.             VI->getPixels(device,(unsigned char*)img->imageData,false,true);//IplImage 格式  
  42.             VI->getPixels(device,(unsigned char*)cmat.data,false,false);//opencv 的c++接口的转化。  
  43.             VI->getPixels(device,(unsigned char*)cmat2.data,false,false);  
  44.             imshow("tt",cmat);  
  45.             imshow("tt2",cmat2);  
  46.             cvShowImage("hello",img);  
  47.             if( cvWaitKey(2) >=0)  
  48.                 break;  
  49.         }  
  50.     }  
  51.     VI->stopDevice(1);//释放设备。  
  52.     getchar();  
  53.       
  54.     return 0;  
  55. }   
posted @ 2014-09-10 16:09  比尔教授  阅读(412)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3