有谁知道你可以推荐的一些好的易学的openCV c/c ++教程?我试过谷歌,但我对结果不太满意.
要跟踪视频帧上的对象,首先我从视频中提取图像帧并将这些图像保存到文件夹中.然后我应该处理这些图像以找到一个对象.实际上我不知道这是否是实用的,因为所有的算法都是一步完成的.它是否正确?
我有一个视频engine2.avi,我想用openCV阅读和展示.这是我的代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
string filename = "D:\\BMDvideos\\engine2.avi";
VideoCapture capture(filename);
Mat frame;
if( !capture.isOpened() )
throw "Error when reading steam_avi";
namedWindow("w", 1);
for( ; ; )
{
capture >> frame;
//if(!frame)
// break;
imshow("w", frame);
waitKey(20); // waits to display frame
}
waitKey(0);
}
Run Code Online (Sandbox Code Playgroud)
如果我的文件有编解码器YUV 4:2:2 (UYVY)(我使用Direct-Show录制视频),此代码不起作用,但是当我使用视频时,我可以使用openCV!
有谁知道这是如何工作的?
更新:
在阅读了一些链接后,建议捕获异常将解决问题,我修改了我的代码.它没有帮助,但这里是修改后的代码:
cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;
try
{
cap >> frame;
}
catch(cv::Exception ex)
{
std::cout …Run Code Online (Sandbox Code Playgroud) 整整一天我已经尝试了很多东西来获得子图像中的所有相关匹配(使用matchtemplate函数),这是我已经使用mousecallback函数从原始图像中提取的ROI.所以我的代码在下面是匹配功能
////Matching Function
void CTemplate_MatchDlg::OnBnTemplatematch()
{
namedWindow("reference",CV_WINDOW_AUTOSIZE);
while(true)
{
Mat ref = imread("img.jpg"); // Original Image
mod_ref = cvCreateMat(ref.rows,ref.cols,CV_32F);// resizing the image to fit in picture box
resize(ref,mod_ref,Size(),0.5,0.5,CV_INTER_AREA);
Mat tpl =imread("Template.jpg"); // TEMPLATE IMAGE
cvSetMouseCallback("reference",find_mouseHandler,0);
Mat aim=roiImg1.clone(); // SUB_IMAGE FROM ORIGINALIMAGE
// aim variable contains the ROI matrix
// next, want to perform template matching in that ROI // and display results on original image
if(select_flag1 == 1)
{
// imshow("ref",aim);
Mat res(aim.rows-tpl.rows+1, aim.cols-tpl.cols+1,CV_32FC1);
matchTemplate(aim, tpl, res, CV_TM_CCOEFF_NORMED);
threshold(res, res, …Run Code Online (Sandbox Code Playgroud) 我想编写一个使用OpenCV进行视频捕获的跨平台应用程序.在所有示例中,我发现使用抓取功能处理来自摄像机的帧并等待一段时间.我想处理序列中的每一帧.我想定义我自己的回调函数,当新帧准备好被处理时,它将被执行(就像在Windows的directshow中,当您为此目的定义和放入图形时你自己的过滤器).
所以问题是:我怎么能这样做?
我正在构建一个OpenCV应用程序,它从相机中捕获视频,并在删除背景后将其覆盖在另一个视频上.
我无法达到合理的速度,因为它以大约1 fps的速度播放输出,而我的背景移除工作速度为3fps.
有没有办法以正常速度显示背景视频并以3fps覆盖已处理的视频?
我试着评论我的代码,我意识到问题主要在于渲染部分本身.我尝试显示视频和我的网络摄像头,我注意到用openCV显示的实际fps和视频的fps有所下降.
这是示例代码:
void main()
{
CvCapture* capture, *Vcap;
capture = cvCaptureFromCAM(0);
if(!capture)
{
printf("Video Load Error");
}
Vcap = cvCaptureFromAVI("bgDemo.mp4");
//printf("\nEntered BGR");
if(!Vcap)
{
printf("Video Load Error");
}
while(1)
{
IplImage* src = cvQueryFrame(Vcap);
if(!src)
{
Vcap = cvCaptureFromAVI("bgDemo.mp4");
continue;
}
IplImage* bck1 = cvCreateImage(cvGetSize(src),8,3);
cvResize(src,bck1,CV_INTER_LINEAR);
cvShowImage("BCK",bck1);
cvWaitKey(1);
}
}
Run Code Online (Sandbox Code Playgroud)