我正在尝试使用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;
};
此外,返回前的最后一行应使其按下转义键关闭程序,但它会导致程序因某种原因自动关闭。那里有什么建议吗?
这是我遇到的错误的一个例子
损坏的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
通过让它从网络摄像头获取第一个图像帧然后进入睡眠我已经确定代码IS实际上至少获得了第一个图像的有效图像数据。也许有一种方法我可以找出获取图像的频率,以便它不会发送不变的信息。不过,我不明白为什么它不能用于持续的信息。这非常令人沮丧。
正如您所看到的,我已经从代码中删除了几乎所有内容,但没有任何工作。
我在这个问题中尝试了所有三个答案,但没有任何帮助:Opencv Error on Ubuntu Webcam (Logitech C270) Capture -> HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
感谢您的帮助!
答案 0 :(得分:1)
当您编写if(waitKey(10) >= 0) break
时,在第一次迭代后,您的while循环始终为break
,因为waitKey
返回用户按下的键,如果在指定时间内没有按下则为0(10ms in你的情况)。要显示输入,只要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);
};
只要输入流可以解码,就应该显示你的图像。