⑴ 求助貼.如何用Opencv實現物體的識別與抓取
背景提取可以用GMM(高斯混合模型)+形態學處理,雖然時間復雜度比較大但是效果很好。但我之前寫的代碼都是Matlab的,opencv不熟悉,不過在stack overflow之類的網站上搜一下應該不難找到opencv版代碼。
⑵ opencv抓取攝像頭圖像 二值化
把pBkImg中這個IPL_DEPTH_32F換成跟你原圖像一致的IPL_DEPTH_8U,再試試看。CV_Assert( src.depth() == dst.depth() );
⑶ 【手勢識別】opencv通過攝像頭獲取實時數據後怎麼弄
你只管處理讀到的圖像就行
⑷ opencv實現攝像頭時時抓捕人臉只能抓一幀怎麼回事
網上代碼:
#include <opencv\highgui.h>//包含opencv庫頭文件
#include <opencv\cv.h>
//#include<iostream>
//using namespace std;
using namespace cv;
int main( int argc, char** argv ) {//主函數
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );//創建窗口,(名字,默認大小)
CvCapture *capture = NULL;// 視頻獲取結構,用來作為視頻獲取函數的一個參數
capture = cvCreateCameraCapture(0);//打開攝像頭,從攝像頭中獲取視頻
IplImage* frame;//申請IplImage類型指針,就是申請內存空間來存放每一幀圖像
while(1) {
frame = cvQueryFrame( capture );// 從攝像頭中抓取並返回每一幀
if( !frame ) break;//如果抓取幀為空 break 打破循環否則將抓取的那一幀顯示在創建的窗口上
cvShowImage( "Example2", frame );//在窗口上顯示每一幀
char c = cvWaitKey(33);//延時,每秒鍾約33幀;符合人眼觀看速度;
if( c == 27 ) break;//由於是死循環,而且沒有控制台,當按下鍵盤esc鍵,將按鍵的ASCII值給C,如果C為ESC(ASCII 為27)循環退出退出循環;
}
cvReleaseCapture( &capture );//釋放內存;
cvDestroyWindow( "Example2" );//銷毀窗口
return 0;
}
第一次運行還能啟動下筆記本的攝像頭(攝像頭燈是亮的),但是frame上一片黑
第二次運行開始就老是出現這種界面,求助,用的是opencv-3.0.0 win7 63位
⑸ 如何用OpenCV實現從黑到白抓取一個邊緣
求取黑白過度處的梯度。
梯度大的地方基本上就可以將其定義為邊緣。
⑹ 最簡單的opencv提取攝像頭視頻 獲取攝像頭cvCreateCameraCapture(-1)就失敗了
cvCreateCameraCapture 初始化從攝像頭中獲取視頻
CvCapture* cvCreateCameraCapture( int index );
index 要使用的攝像頭索引。如果只有一個攝像頭或者用哪個攝像頭也無所謂,那使用參數-1應該便可以。
函數cvCreateCameraCapture給從攝像頭的視頻流分配和初始化CvCapture結構。
若想顯示攝像頭中採集的內容還需採用:
cvQueryFrame
從攝像頭或者文件中抓取並返回一幀
IplImage* cvQueryFrame( CvCapture* capture );
還要調用圖像顯示(從攝像頭抓取的幀為iplimage類型)
cvShowImage
在指定窗口中顯示圖像
void cvShowImage( const char* name, const CvArr* image );
name窗口的名字。 image被顯示的圖像。
函數cvShowImage 在指定窗口中顯示圖像。如果窗口創建的時候被設定標志CV_WINDOW_AUTOSIZE,那麼圖像將以原始尺寸顯示;否則,圖像將被伸縮以適合窗口大小。
不知道能不能幫到你
⑺ 請問誰能提供opencv實現的視頻中運動行人檢測與追蹤的程序
記得給我分,急需
#include "cv.h"
#include <cxcore.h>
#include "highgui.h"
#include <time.h>
#include <math.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
// various tracking parameters (in seconds)
const double MHI_DURATION = 0.5;
const double MAX_TIME_DELTA = 0.5;
const double MIN_TIME_DELTA = 0.05;
const int N = 3;
//
const int CONTOUR_MAX_AERA = 16;
// ring image buffer
IplImage **buf = 0;
int last = 0;
// temporary images
IplImage *mhi = 0;
// MHI: motion history image
int filter = CV_GAUSSIAN_5x5;
CvConnectedComp *cur_comp, min_comp;
CvConnectedComp comp;
CvMemStorage *storage; CvPoint pt[4];
// 參數:
// img – 輸入視頻幀
// dst – 檢測結果
void update_mhi( IplImage* img, IplImage* dst, int diff_threshold )
{
double timestamp = clock()/100.;
// get current time in seconds
CvSize size = cvSize(img->width,img->height);
// get current frame size
int i, j, idx1, idx2;
IplImage* silh;
uchar val;
float temp;
IplImage* pyr = cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 );
CvMemStorage *stor;
CvSeq *cont, *result, *squares;
CvSeqReader reader;
if( !mhi || mhi->width != size.width || mhi->height != size.height )
{
if( buf == 0 )
{
buf = (IplImage**)malloc(N*sizeof(buf[0]));
memset( buf, 0, N*sizeof(buf[0]));
}
for( i = 0; i < N; i++ )
{
cvReleaseImage( &buf[i] );
buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 );
cvZero( buf[i] );
}
cvReleaseImage( &mhi );
mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 );
cvZero( mhi );
// clear MHI at the beginning
}
// end of if(mhi)
cvCvtColor( img, buf[last], CV_BGR2GRAY );
// convert frame to grayscale
idx1 = last;
idx2 = (last + 1) % N;
// index of (last - (N-1))th frame
last = idx2;
// 做幀差
silh = buf[idx2];
cvAbsDiff( buf[idx1], buf[idx2], silh );
// get difference between frames
// 對差圖像做二值化
cvThreshold( silh, silh, 30, 255, CV_THRESH_BINARY );
// and threshold it
cvUpdateMotionHistory( silh, mhi, timestamp, MHI_DURATION );
// update MHI
cvCvtScale( mhi, dst, 255./MHI_DURATION,
(MHI_DURATION - timestamp)*255./MHI_DURATION );
cvCvtScale( mhi, dst, 255./MHI_DURATION, 0 );
// 中值濾波,消除小的雜訊
cvSmooth( dst, dst, CV_MEDIAN, 3, 0, 0, 0 );
// 向下采樣,去掉雜訊
cvPyrDown( dst, pyr, 7 );
cvDilate( pyr, pyr, 0, 1 );
// 做膨脹操作,消除目標的不連續空洞
cvPyrUp( pyr, dst, 7 );
//
// 下面的程序段用來找到輪廓
//
// Create dynamic structure and sequence.
stor = cvCreateMemStorage(0);
cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);
// 找到所有輪廓
cvFindContours( dst, stor, &cont, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
// 直接使用CONTOUR中的矩形來畫輪廓
for(;cont;cont = cont->h_next)
{
CvRect r = ((CvContour*)cont)->rect;
if(r.height * r.width > CONTOUR_MAX_AERA) // 面積小的方形拋棄掉
{
cvRectangle( img, cvPoint(r.x,r.y),
cvPoint(r.x + r.width, r.y + r.height),
CV_RGB(255,0,0), 1, CV_AA,0);
}
} // free memory
cvReleaseMemStorage(&stor);
cvReleaseImage( &pyr );
}
int main(int argc, char** argv)
{
IplImage* motion = 0;
CvCapture* capture = 0; //視頻獲取結構
if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
//原型:extern int isdigit(char c); //用法:#include <ctype.h> 功能:判斷字元c是否為數字 說明:當c為數字0-9時,返回非零值,否則返回零。
capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 1 );
else if( argc == 2 )
capture = cvCaptureFromAVI( argv[1] );
if( capture )
{
cvNamedWindow( "Motion", 1 );
for(;;)
{
IplImage* image;
if( !cvGrabFrame( capture )) //從攝像頭或者視頻文件中抓取幀
break;
image = cvRetrieveFrame( capture );
//取回由函數cvGrabFrame抓取的圖像,返回由函數cvGrabFrame 抓取的圖像的指針
if( image )
{
if( !motion )
{
motion = cvCreateImage( cvSize(image->width,image->height), 8, 1 );
cvZero( motion );
motion->origin = image->origin;
///* 0 - 頂—左結構, 1 - 底—左結構 (Windows bitmaps 風格) */
}
}
update_mhi( image, motion, 60 );
cvShowImage( "Motion", image );
if( cvWaitKey(10) >= 0 )
break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Motion" );
}
return 0;
}
⑻ opencv中如何將從視頻中抓取的幀釋放掉
Mat frame;
frame.release();
⑼ opencv 如何能把從攝像頭中抓取的兩帳圖片進行精確比較
你直接用幀差法看看就知道了
這種方法不靠譜的,一個是攝像機的白平衡,一個是移動目標對光場的擾動
⑽ opencv中從視頻里抓取一幀並把前景目標扣取出來,這個怎麼實現
你說的前景提取,具體是什麼樣的呢,背景固定的好提取,背景不固定的難,最簡單的方法是用高斯混合模版,opencv里好像有這個函數gmm