【问题标题】:OpenCV Logitech p270 giving corrupt dataOpenCV Logitech p270 提供损坏的数据
【发布时间】:2017-02-27 15:16:24
【问题描述】:

我正在尝试使用 OpenCV 使用 p270 摄像头进行边缘检测,当我可以让它打开我的网络摄像头时,它收到的所有数据都以损坏的形式返回。我的代码目前很简单,只是想开始,但这让我很头疼。这是我的代码:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
//#include <opencv\cv.h>
//#include <opencv\highgui.h>
#include <iostream>
using namespace cv;

//Mat src, src_gray;
//Mat dst, detected_edges;

int main() {
       VideoCapture capture(1);
       if(!capture.isOpened()) {
               printf("Camera failed to initialize\n");
               return 1;
       };
       Mat src, src_gray;
       Mat detected_edges;
       while(1) {
               capture >> src;
               //cvtColor(src, src_gray, CV_BGR2GRAY);
               //Canny(src_gray, detected_edges, 20, 60, 3);
               imshow("Source", src);
               //imshow("Gray Edges", detected_edges);

               //if(waitKey(10) >= 0) break;
       };

       return 0;
};

另外,return 之前的最后一行应该使得按下退出键关闭程序,但由于某种原因它会导致程序自动关闭。有什么建议吗?

这是我遇到的错误的示例

损坏的 JPEG 数据:标记 0xd6 之前的 10 个无关字节

损坏的 JPEG 数据:标记 0xd3 之前的 6 个无关字节

损坏的 JPEG 数据:标记 0xd0 之前的 2 个无关字节

损坏的 JPEG 数据:标记 0xd3 之前的 6 个无关字节

损坏的 JPEG 数据:标记 0xd3 之前的 2 个无关字节

损坏的 JPEG 数据:标记 0xd6 之前的 4 个无关字节

这是我使用的编译命令,以防它是编译时问题,但我非常怀疑。最好覆盖我所有的基地

g++ -o edge edge_detection.cpp $(pkg-config opencv --cflags --libs)

如果有人能提供帮助,我将不胜感激。

我尝试用我的标准笔记本电脑网络摄像头运行它,虽然我没有收到损坏的 jpeg 数据错误,但我只得到以下两行输出,然后是应该保存来自网络摄像头超时。

init done
opengl support available

通过让它从网络摄像头获取第一个图像帧然后进入睡眠状态,我确定代码实际上至少为第一个图像获取了有效的图像数据。也许有一种方法可以让我间隔多久获取一次图像,这样它就不会发送恒定的信息。不过,我不明白为什么它不适用于不断输入的信息。这非常令人沮丧。

我尝试过的事情

如您所见,我已从代码中删除了几乎所有不需要但没有任何效果的内容。

我已经尝试了这个问题的所有三个答案,但没有任何帮助:Opencv Error on Ubuntu Webcam (Logitech C270) Capture -> HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

感谢您的帮助!

【问题讨论】:

  • 尝试用cv::waitKey(1) != 27替换while条件中的1
  • @slawekwin 这行得通,谢谢!您能否将此添加为答案,以便获得一些荣誉(也许是解释)?

标签: c++ opencv


【解决方案1】:

当您编写if(waitKey(10) &gt;= 0) break 时,您在第一次迭代后始终将while 循环设为break,因为waitKey 返回用户按下的键,如果在指定时间(在您的情况下为10 毫秒)内没有按下任何键,则返回0。要显示您的输入,您需要循环,只要 waitKey 没有返回您期望的键(您说 escape = 27 ASCII),所以尝试:

   while (waitKey(10) != 27) {
           capture >> src;
           //cvtColor(src, src_gray, CV_BGR2GRAY);
           //Canny(src_gray, detected_edges, 20, 60, 3);
           imshow("Source", src);
           //imshow("Gray Edges", detected_edges);               
   };

只要输入流可以被解码,这应该会显示您的图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多