OpenCV视觉识别的算法问题

Devil_Cat 2016-01-20 09:26:29
加精
新手入门,做了一个视觉识别的程序,然后发现分辨率有问题,调用的是笔记本的内置摄像头,然后分辨率比自己设置的160*120大的多,结果就是输出的一个窗口上有整个的图像,另一个窗口上记录的识别范围只有整个图像的一个小角。
另外整个的算法貌似也太繁琐了,用笔记本运行起来都一卡一卡的,处理速度跟不上,求大神指点一下有没有什么更好的算法
?或者能不能把摄像头传来的图像进行压缩,变成小图再进行处理?会不会快一些?
以下代码:
#include "cv.h"
#include "highgui.h"
#include <ctype.h>
#include <stdio.h>

using namespace cv;

int main(int argc, char** argv)
{
IplImage* frame;
IplImage* different;
CvCapture* capture=0;
Mat sample=imread("sample.bmp");//150*90
bool equal=false;

capture=cvCaptureFromCAM(0);

if(!capture)
{
printf("Could not initialize capturing \n");
return -1;
}

frame=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
cvNamedWindow("Image",0);
cvNamedWindow("distinguish",0);
different=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

while(capture)
{

frame=cvQueryFrame(capture);

Mat frame0(frame,0);
Mat distinguish(different,0);
imshow("distinguish",distinguish);
bool re=true;
cvShowImage("Image",frame);
//判断
for(int j=0;j<480;j+=8)
{
uchar *datai=frame0.ptr<uchar>(j);//创建原图j行指针
uchar *datad=distinguish.ptr<uchar>(j);
for(int i=0,k=0;i<640*3;i+=24,k+=8)
{
equal=false;
for(int j1=0;j1<90;j1++)
{
uchar *datas=sample.ptr<uchar>(j1);//创建对比图j1行指针
for(int i1=0;i1<150*3;i1+=3)
{
if((datai[i]==datas[i1])&&(datai[i+1]==datas[i1+1])&&(datai[i+2]==datas[i1+2]))
{
equal=true;
datad[k]=255;
break;
}
if(equal)
break;
}
if(equal)
break;
}
}

}
Mat different1;
dilate(distinguish,different1,Mat(),Point(-1,-1),8);
erode(different1,distinguish,Mat(),Point(-1,-1),8);
if(cvWaitKey(1)==27)
break;


}

cvReleaseCapture(&capture);
cvDestroyWindow("Image");


}
...全文
1470 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
每隔几帧识别一次,试下~
勤奋的小游侠 2016-02-16
  • 打赏
  • 举报
回复
if((datai[i]==datas[i1])&&(datai[i+1]==datas[i1+1])&&(datai[i+2]==datas[i1+2])) { equal=true; datad[k]=255; break; } 这种问题应该用图像相减,而不是自己来做一个循环。 自己实现的东西效率比库函数低太多太多了。
tauke_wang 2016-02-01
  • 打赏
  • 举报
回复
用ROI吧,在多线程中每隔几帧试试
图灵转世 2016-01-29
  • 打赏
  • 举报
回复
降低摄像头帧数,每秒4帧试试。
道亦无名 2016-01-29
  • 打赏
  • 举报
回复
表示这个问题其实可以这样做: 首先包数据采集 ,后再压缩,最后在解压还原。
sunny7862632 2016-01-25
  • 打赏
  • 举报
回复
4层循环,里面竟然还有乘法,能不卡就奇迹了
qq5720222 2016-01-25
  • 打赏
  • 举报
回复
这里高手如云啊
晒月光的青蛙 2016-01-25
  • 打赏
  • 举报
回复
先说说你这个算法是想用来做什么的吧
cattpon 2016-01-24
  • 打赏
  • 举报
回复
这个的计算量会不会太大?
赵4老师 2016-01-23
  • 打赏
  • 举报
回复
引用 5 楼 Devil_Cat 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] ROI
具体应该怎么操作呢?我只会设置一块固定的区域作为ROI,但是要识别的是整个摄像头的范围啊[/quote] 那就在抓取一帧后先缩小尺寸。
shiter 2016-01-22
  • 打赏
  • 举报
回复
尝试一下感知哈希算法
Devil_Cat 2016-01-22
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
ROI
具体应该怎么操作呢?我只会设置一块固定的区域作为ROI,但是要识别的是整个摄像头的范围啊
Devil_Cat 2016-01-22
  • 打赏
  • 举报
回复
引用 1 楼 wangyaninglm 的回复:
你这个每一帧都识别,而且是几重循环的,运算量应该挺大吧
是的,所以跑起来非常卡,但是也没想到有什么别的思路
赵4老师 2016-01-21
  • 打赏
  • 举报
回复
ROI
lx624909677 2016-01-21
  • 打赏
  • 举报
回复
OpenCV在调用摄像头的时候,分辨率只能是640*480的,想用更大或更小分辨率的话,要用Directshow
shiter 2016-01-21
  • 打赏
  • 举报
回复
你这个每一帧都识别,而且是几重循环的,运算量应该挺大吧

19,468

社区成员

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

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