MFC OPENCV 获取摄像头视频,利用控件实时回复图像并对图像进行处理,显示处理结果

zhongtenghui 2014-11-11 01:18:42

本人小白,刚接触MFC 又要用到opencv一下子有点晕,具体情况是这样的,我想用已有的摄像头制作一个MFC 对话框,部分显示视频,同时添加控件用于显示一些需要的图片信息,比如灰度(当然旁边显示灰度图像也可以)等等,之前一直用MATLAB做图像处理,现在要用C++有点懵了 还望各位路过的大神赐教啊!!!!小弟拜谢@@ 如有代码赐教可以发送邮箱 283998291@qq.com 再次感谢!!!
...全文
1124 47 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongtenghui 2014-11-20
  • 打赏
  • 举报
回复
引用 46 楼 zhongtenghui 的回复:
unsigned char * pImgData = (unsigned char *)(&pData); int width = m_header.biWidth; int height = m_header.biHeight; int biBitCount = 24; int lineByte = (width*biBitCount/8+3)/4*4; int i,j,k; int lpx=0; int px = 0; unsigned int mat[20000][10000]; for(i=0;i<height;i++) { for(j=0;j<width;j++) { for(k=0;k<3;k++) { px = *(pImgData+i*lineByte+j*3+k); //bgr lpx =lpx + px/3; } mat[i][j] = lpx; //int a = 0; } } 这部分想对指针指向的图像数据进行读取并存入一个二维矩阵,会有问题吗?
存的是bgr,想用彩色图的各1/3简单计算灰度,并返回给像素。
zhongtenghui 2014-11-20
  • 打赏
  • 举报
回复
unsigned char * pImgData = (unsigned char *)(&pData); int width = m_header.biWidth; int height = m_header.biHeight; int biBitCount = 24; int lineByte = (width*biBitCount/8+3)/4*4; int i,j,k; int lpx=0; int px = 0; unsigned int mat[20000][10000]; for(i=0;i<height;i++) { for(j=0;j<width;j++) { for(k=0;k<3;k++) { px = *(pImgData+i*lineByte+j*3+k); //bgr lpx =lpx + px/3; } mat[i][j] = lpx; //int a = 0; } } 这部分想对指针指向的图像数据进行读取并存入一个二维矩阵,会有问题吗?
zhongtenghui 2014-11-20
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
hr = spIWICBitmapFrameEncode->WritePixels(pHeader->biHeight, TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount), TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount) * pHeader->biHeight, (BYTE*)pData); if (FAILED(hr)) return FALSE; 这句表明:图片数据在pData所指内存字节中(在调用该函数之前已经就绪了)。 格式为前面提到的: SetSize(pHeader->biWidth, pHeader->biHeight); GUID_WICPixelFormat24bppBGR pHeader->biBitCount
赵老师,这个问题我真的碰到问题了,希望能得到您的提点。
zhongtenghui 2014-11-18
  • 打赏
  • 举报
回复
引用 41 楼 ToAsuN 的回复:
[quote=引用 37 楼 zhongtenghui 的回复:] [quote=引用 34 楼 zhao4zhong1 的回复:] fprintf(fp,"%d,%d,%d,",p[0],p[1],p[2]); 应该是 fprintf(f,"%d,%d,%d,",p[0],p[1],p[2]);
谢谢 只是现在我想实时显示我需要的参数就没法完成了 如果能在mfc工程代码中 直接读取计算就好了。。。[/quote] 可以参考一下matlab + c的混合编程[/quote] 我还是选择学习用下CDib这个位图处理的类把
赵4老师 2014-11-18
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
建议楼主先编译链接调试OpenCV自带的相关例子代码。
我不喜欢不听话的孩纸!
zhongtenghui 2014-11-18
  • 打赏
  • 举报
回复
虽然我最后还是没完成,不过还是学到很多,分给了赵老师,希望以后能多多请教!也感谢各位的耐心解读。
肉肉_Alex 2014-11-17
  • 打赏
  • 举报
回复
引用 37 楼 zhongtenghui 的回复:
[quote=引用 34 楼 zhao4zhong1 的回复:] fprintf(fp,"%d,%d,%d,",p[0],p[1],p[2]); 应该是 fprintf(f,"%d,%d,%d,",p[0],p[1],p[2]);
谢谢 只是现在我想实时显示我需要的参数就没法完成了 如果能在mfc工程代码中 直接读取计算就好了。。。[/quote] 可以参考一下matlab + c的混合编程
肉肉_Alex 2014-11-17
  • 打赏
  • 举报
回复
引用 39 楼 zhongtenghui 的回复:
[quote=引用 38 楼 zhongtenghui 的回复:] [quote=引用 33 楼 zhao4zhong1 的回复:] 将我写的这段代码插入到紧挨 hr = spIWICBitmapFrameEncode->WritePixels(pHeader->biHeight, TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount), TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount) * pHeader->biHeight, (BYTE*)pData); if (FAILED(hr)) return FALSE; 前面,试试看。 data0000.txt~data9999.txt文件内容为第0~9999次调用此函数时的像素BGR数据。 每个像素三个0~255的十进制值,逗号间隔,本行像素结束时换行。 超过9999会再次从0开始。
尊敬的赵老师,我看到您的代码中应该是可以直接得到一帧图像的所有RGB 像素信息了,那我现在如果不需要每一帧都取出来,只需要对每一帧进行计算,或者对一定间隔比如每5帧取一帧,不显示图像,只进行计算,比如我对该帧转化为灰度求γ等,我的理解是否正确?[/quote] 或者说是可行的?[/quote] 对帧的控制需要借助SDK或者自己来控制输入的帧数。转灰度图的话我不清楚SDK回来的是RGBxxx、HSL、HSV还是其他格式,这都需要自己调用opencv的具体函数去转换。具体的格式你需要去参考一些资料。另外需要注意一点的是,既然使用了别人的SDK,会有这样一种情况,视频流本身就被厂商篡改过,加入了很多冗余的无用信息,需要自己去分辨处理。
zhongtenghui 2014-11-17
  • 打赏
  • 举报
回复
引用 38 楼 zhongtenghui 的回复:
[quote=引用 33 楼 zhao4zhong1 的回复:] 将我写的这段代码插入到紧挨 hr = spIWICBitmapFrameEncode->WritePixels(pHeader->biHeight, TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount), TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount) * pHeader->biHeight, (BYTE*)pData); if (FAILED(hr)) return FALSE; 前面,试试看。 data0000.txt~data9999.txt文件内容为第0~9999次调用此函数时的像素BGR数据。 每个像素三个0~255的十进制值,逗号间隔,本行像素结束时换行。 超过9999会再次从0开始。
尊敬的赵老师,我看到您的代码中应该是可以直接得到一帧图像的所有RGB 像素信息了,那我现在如果不需要每一帧都取出来,只需要对每一帧进行计算,或者对一定间隔比如每5帧取一帧,不显示图像,只进行计算,比如我对该帧转化为灰度求γ等,我的理解是否正确?[/quote] 或者说是可行的?
zhongtenghui 2014-11-17
  • 打赏
  • 举报
回复
引用 33 楼 zhao4zhong1 的回复:
将我写的这段代码插入到紧挨 hr = spIWICBitmapFrameEncode->WritePixels(pHeader->biHeight, TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount), TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount) * pHeader->biHeight, (BYTE*)pData); if (FAILED(hr)) return FALSE; 前面,试试看。 data0000.txt~data9999.txt文件内容为第0~9999次调用此函数时的像素BGR数据。 每个像素三个0~255的十进制值,逗号间隔,本行像素结束时换行。 超过9999会再次从0开始。
尊敬的赵老师,我看到您的代码中应该是可以直接得到一帧图像的所有RGB 像素信息了,那我现在如果不需要每一帧都取出来,只需要对每一帧进行计算,或者对一定间隔比如每5帧取一帧,不显示图像,只进行计算,比如我对该帧转化为灰度求γ等,我的理解是否正确?
zhongtenghui 2014-11-17
  • 打赏
  • 举报
回复
引用 34 楼 zhao4zhong1 的回复:
fprintf(fp,"%d,%d,%d,",p[0],p[1],p[2]); 应该是 fprintf(f,"%d,%d,%d,",p[0],p[1],p[2]);
谢谢 只是现在我想实时显示我需要的参数就没法完成了 如果能在mfc工程代码中 直接读取计算就好了。。。
zhongtenghui 2014-11-14
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
注意一个像素占三个字节! 注意“每行像素数*3:pHeader->biWidth*3”和“每行字节数:TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)”不一定相等! 所以第一个像素: 蓝:((unsigned char *)pData)[0] 绿:((unsigned char *)pData)[1] 红:((unsigned char *)pData)[2] 第N行第M列像素: 蓝:((unsigned char *)pData+3*(N*TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)+m))[0] 绿:((unsigned char *)pData+3*(N*TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)+m))[1] 红:((unsigned char *)pData+3*(N*TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)+m))[2]
byte* pData 是被强制转型的把,对于整体的void* pData 我如何直接赋值 给我定义的矩阵
zhongtenghui 2014-11-14
  • 打赏
  • 举报
回复
引用 21 楼 ToAsuN 的回复:
没c基础就好好学一下。pData是数据首地址(第一个像素地址),第N行第M列像素值= pData[n*pHeader->biWidth+m],换言之,从pData[w*h]这就是你要的矩阵,对指针操作不熟的话建议你先学习一下基本操作。
pData是被强制转型的,他是void*类型的,无法赋值。
赵4老师 2014-11-14
  • 打赏
  • 举报
回复
fprintf(fp,"%d,%d,%d,",p[0],p[1],p[2]); 应该是 fprintf(f,"%d,%d,%d,",p[0],p[1],p[2]);
赵4老师 2014-11-14
  • 打赏
  • 举报
回复
将我写的这段代码插入到紧挨 hr = spIWICBitmapFrameEncode->WritePixels(pHeader->biHeight, TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount), TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount) * pHeader->biHeight, (BYTE*)pData); if (FAILED(hr)) return FALSE; 前面,试试看。 data0000.txt~data9999.txt文件内容为第0~9999次调用此函数时的像素BGR数据。 每个像素三个0~255的十进制值,逗号间隔,本行像素结束时换行。 超过9999会再次从0开始。
赵4老师 2014-11-14
  • 打赏
  • 举报
回复
匆忙之间,难免有些小笔误: sprintf(fn,"data%04d.txt",nnnn); fprintf(fp,"%d,%d,%d,",p[0],p[1],p[2]);
zhongtenghui 2014-11-14
  • 打赏
  • 举报
回复
引用 30 楼 zhao4zhong1 的回复:
在SaveImageByWIC函数中插入以下代码将pData中的数据在每次调用该函数时写入文件data0000.txt~data9999.txt中:
static nnnn=0;
char fn[256];
unsigned char *p,*r;
FILE *f;
int y,x;
sprintf(fn"data%04d.txt",nnnn);
nnnn++;if (nnnn>9999) nnnn=0;
f=fopen(fn,"w");
r=(unsigned char *)pData;
for (y=0;y<pHeader->biHeight;y++) {
 p=r;
 for (x=0;x<pHeader->biWidth;x++) {
  fprintf("%d,%d,%d,",p[0],p[1],p[2]);
  p+=3;
 }
 fprintf(f,"\n");
 r+=TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount);
}
fclose(f);
你用matlab从文件data0000.txt~data9999.txt中读吧。
谢谢赵老师的耐心解读,也感谢不厌其烦的回答,我按照您的说法加入函数后 有几个小问题; 1:sprintf(fn"data%04d.txt",nnnn); error "data%04d.txt" 应输入“)” 2:fprintf("%d,%d,%d,",p[0],p[1],p[2]);error "%d,%d,%d," "const char *"类型的实参与"FILE*"类型形参不兼容。 感觉你们的意思我在实施的时候一直是出现各种实参形参的不兼容性,看来我是得好好看看他的函数了。。。
赵4老师 2014-11-14
  • 打赏
  • 举报
回复
在SaveImageByWIC函数中插入以下代码将pData中的数据在每次调用该函数时写入文件data0000.txt~data9999.txt中:
static nnnn=0;
char fn[256];
unsigned char *p,*r;
FILE *f;
int y,x;
sprintf(fn"data%04d.txt",nnnn);
nnnn++;if (nnnn>9999) nnnn=0;
f=fopen(fn,"w");
r=(unsigned char *)pData;
for (y=0;y<pHeader->biHeight;y++) {
 p=r;
 for (x=0;x<pHeader->biWidth;x++) {
  fprintf("%d,%d,%d,",p[0],p[1],p[2]);
  p+=3;
 }
 fprintf(f,"\n");
 r+=TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount);
}
fclose(f);
你用matlab从文件data0000.txt~data9999.txt中读吧。
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
注意一个像素占三个字节! 注意“每行像素数*3:pHeader->biWidth*3”和“每行字节数:TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)”不一定相等! 所以第一个像素: 蓝:((unsigned char *)pData)[0] 绿:((unsigned char *)pData)[1] 红:((unsigned char *)pData)[2] 第N行第M列像素: 蓝:((unsigned char *)pData+3*(N*TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)+m))[0] 绿:((unsigned char *)pData+3*(N*TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)+m))[1] 红:((unsigned char *)pData+3*(N*TDIBWIDTHBYTES(pHeader->biWidth * pHeader->biBitCount)+m))[2]
zhongtenghui 2014-11-13
  • 打赏
  • 举报
回复
引用 21 楼 ToAsuN 的回复:
没c基础就好好学一下。pData是数据首地址(第一个像素地址),第N行第M列像素值= pData[n*pHeader->biWidth+m],换言之,从pData[w*h]这就是你要的矩阵,对指针操作不熟的话建议你先学习一下基本操作。
谢谢!
加载更多回复(25)

19,472

社区成员

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

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