Tag: opencv

在cvSetCaptureProperty中使用CV_CAP_PROP_POS_FRAMES获取单个帧

我试图通过设置CV_CAP_PROP_POS_FRAMES属性然后像这样读取框架来跳转到特定的框架: cvSetCaptureProperty( input_video, CV_CAP_PROP_POS_FRAMES, current_frame ); frame = cvQueryFrame( input_video ); 我面临的问题是,OpenCV 2.1为current_frame的12个连续值返回相同的帧,而我想读取每个单独的帧,而不仅仅是关键帧。 谁能告诉我有什么问题? 我做了一些研究,发现问题是由解压缩算法引起的。 类似MPEG的算法(包括HD等)不会分别压缩每个帧,而是不时地保存关键帧,然后仅保存最后一帧和后续帧之间的差异。 您报告的问题是由于,当您选择一个帧时,解码器(ffmpeg,可能)会自动前进到下一个关键帧。 那么,有没有办法解决这个问题呢? 我不只想要关键帧,而是每个帧。

OpenCV:如何在图像上应用彩虹渐变图?

假设我们有一个我们以某种方式通过openCV修改的图像: 现在我们很乐意申请Gradient Map(就像我们可以通过photoshop申请) : 所以我想知道如何通过openCV应用渐变映射(彩虹色)?

将opencv处理添加到gstreamer应用程序

我正在尝试执行以下操作:使用gstreamer接收video流并使用opencv进行处理。 我找到了一些解决方案,其中一个是将video写入(来自gstreamer)fifo,然后使用opencv读取它。 (OPTION3这里是MJPEG流媒体和解码 )。 问题是我无法打开管道。 cvCreateFileCapture永远不会返回。 这是我写的部分代码: if(mkfifo(“fifo.avi”, S_IRUSR| S_IWUSR) == -1) { cout<<"Cant create fifo"<<endl; cout<<errno<<endl; } loop = g_main_loop_new(NULL, false); fsink = gst_element_factory_make("filesink", "fsink"); g_object_set(G_OBJECT(fsink), "location", "fifo.avi", NULL); playbin = gst_element_factory_make("playbin2", "play"); g_object_set(G_OBJECT(playbin), "uri", uri.c_str(), NULL); g_object_set(G_OBJECT(playbin), "video-sink", fsink, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE(playbin)); gst_bus_add_signal_watch(bus); g_signal_connect(bus, "message::buffering", G_CALLBACK(&set_playbin_state), playbin); gst_object_unref(bus); cvNamedWindow("output", CV_WINDOW_AUTOSIZE); capture = […]

OpenCV:C ++和C性能比较

现在我正在使用OpenCV API( C++ )开发一些应用程序。 此应用程序使用video处理。 在电脑上一切都很快。 今天我决定在Android上移植这个应用程序(使用camera作为videoinput)。 幸运的是,OpenCV for Android所以我只是将我的原生代码添加到Android应用程序示例中。 一切都很好,除了性能。 我对我的应用程序进行了基准测试,发现该应用程序的工作速度为4-5 fps,实际上是不可接受的(我的设备有单一的1ghz处理器) – 我希望它能以大约10 fps的速度工作。 是否可以在C上完全重写我的应用程序? 我知道使用std::vector这样的东西对开发人员来说很舒服,但我并不关心它。 似乎OpenCV’s C接口具有与C++接口相同的function/方法。 我用Google搜索了这个问题,但没有找到任何结果。 谢谢你的建议。

OpenCV – 关闭图像显示窗口

我正在做一个搜索图像数据库的项目,当我找到一些查询的结果–5个数据库图像时,我想直观地显示结果。 我没有将所有图像保存在内存中,所以我首先加载图像以显示它。 在伪代码中,我有一些简单的想法: for image 1..5 load images display image in a window wait for any keypress close the window 以下是使用OpenCV实现此目的的C++代码片段: IplImage *img; for (int i=0; i < 5; ++i){ img = cvLoadImage(images[i].name.c_str(),1); cvShowImage(("Match" + images[i].name).c_str(), img); cvWaitKey(0); cvDestroyWindow(("Match" + images[i].name).c_str()); // sleep(1); cvReleaseImage(&img); } 这里使用的images数组并不存在于我的代码中,但是为了问题,它包含相对于当前程序运行点(如果是其name成员)的图像的文件名。 我在项目中存储的图像名称略有不同。 上面的代码几乎可以工作:我可以迭代4/5图像确定,但是当显示最后一个图像并按下一个键时,图像变为灰色,我无法关闭图像窗口而不会崩溃我的应用程序的其余部分。 我的第一个想法是,由于编译时优化, cvReleaseImage在cvDestroyWindow完成之前释放图像,并以某种方式使其冻结。 但是,我已经尝试添加一些等待时间(因此我的代码注释掉了sleep(1)行)并没有帮助。 我从我的控制台应用程序调用此显示function,当图像冻结时,控件返回到我的应用程序,我可以继续使用它(但图像窗口仍然在后台冻结)。 你能给我一些关于如何解决这个问题的建议吗? 编辑 自从提出问题以来,我已经定期与一些处理计算机视觉和OpenCV的人交谈,但仍然没有想法。 […]

如何检查opencv窗口是否已关闭

如何检查opencv窗口是否已关闭? 我想要做: cvNamedWindow(“main”, 1); while(!cvWindowIsClosed(“main”)) { cvShowImage(“main”, myImage); } 但这些没有这样的cvWindowIsClosed(…)函数!

如何在从ORIGINAL-IMAGE中提取的SUB-IMAGE中执行模板匹配过程并在原始图像中显示结果

一整天我已经尝试了很多东西来获得子图像中的所有相关匹配(带有matchtemplate函数),这是我已经使用mousecallback函数从原始图像中提取的ROI。 所以我的代码在下面是匹配function ////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 […]

更好的video编程边缘滤波算法

我还在研究最后一个程序 ,虽然我终于找到了如何解决问题(关于如何过滤最大轮廓),但我现在有了一个新问题,或者更确切地说是一个问题。 如您所见,我正在使用Canny算法搜索video中的边缘。 但是我将用于检测的对象没有特定的颜色,因此当对象的颜色与周围的颜色大致相同时(例如,如果对象是silverlight并且背景为白色),对象的边缘将消失,我无法获得物体的轮廓。 现在我将测试OpenCV中可用的每个边缘过滤算法,但为了减少我的工作时间,我需要你的帮助来推荐最好的(或至少更好的)算法而不是canny 。 现在我已经测试了Sobel,但结果并不比canny好。 如果可能的话,请链接我一些好的例子以供参考。 代码: int main( int argc, char** argv ) { CvCapture *cam; CvMoments moments; CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours = NULL; CvSeq* contours2 = NULL; CvPoint2D32f center; int i; cam=cvCaptureFromCAM(0); if(cam==NULL){ fprintf(stderr,”Cannot find any camera. \n”); return -1; } while(1){ IplImage *img=cvQueryFrame(cam); if(img==NULL){return -1;} IplImage *src_gray= cvCreateImage( […]

如何在openCV中以全屏无边框窗口显示图像

我想在全屏无边框窗口中在OpenCV中显示图像。 换句话说,只显示图像像素,没有菜单,工具栏或窗口背景。 使用imshow()或cvShowImage()不启用它: 窗口的宽度增加到全屏但不是高度。 它错过了几个像素。 即使通过更改窗口处理程序的设置,我也无法使其无边界。 我认为问题根源于cvNamedWindow()方法,它创建了主WS_OVERLAPPED窗口,然后创建了一个子imshow() ,所有函数如imshow()或cvGetWindowHandle()在子cvGetWindowHandle()运行。 因此即使是windows命令: SetWindowLong((HWND)cvGetWindowHandle(winName), GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP); 没有帮助,因为孩子不能成为无边界的WS_POPUP 。 有人得到了解决方法吗? 也许,在没有使用opencv内置方法的情况下向窗口显示opencv mat 或某种窗口技巧 PS我尝试了以下代码: cvMoveWindow(“AAA”,0,0); cvSetWindowProperty(“AAA”, CV_WINDOW_FULLSCREEN, CV_WINDOW_FULLSCREEN); // Also I tried this: HWND hwnd = (HWND)cvGetWindowHandle(“AAA”); RECT windowRect; windowRect.left = 0; windowRect.top = 0; windowRect.right = cxScreen; //Display resolution windowRect.bottom = cyScreen; //Display resolution AdjustWindowRect(&windowRect,WS_VISIBLE,false); […]

OpenCV + VS2010上未处理的exception

我可以成功构建并执行以下代码: IplImage* img = cvLoadImage(“C:\\hello.jpg”); cvNamedWindow(“myfirstwindow”); cvShowImage(“myfirstwindow”, img); 但是在执行下面的代码时我得到了未处理的exception: cv::Mat image= cv::imread(“boldt.jpg”); cv::namedWindow(“Image”); cv::imshow(“Image”,image); 虽然,我可以成功构建代码。 我在Windows 7 x86版本上使用opencv2.2和VS2010 x86版本。 请帮忙 ! 更新:我在winxp上尝试过它,它工作正常……它只适用于发布模式下的win7。