- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试同时从两个不同的相机抓取帧,但无论我调用多少次 VideoCapture::grab(),似乎都没有效果。使用 VideoCapture::retrieve() 检索的帧始终是从最后一个 VideoCapture::retrieve() 捕获的第一帧。
我已经在 OpenCV 2.4 和 3.1 上测试过它,在 Windows 上使用罗技 C920 摄像头。
例子:
VideoCapture vCapture;
Mat imgResult;
vCapture.open(0); //at this point, there is a green sheet in front of the camera
Sleep(100000); //change green sheet with red sheet
vCapture.grab(); //returns true
vCapture.retrieve(imgResult); //image with green sheet is retrieved
Sleep(100000); //change red sheet with blue sheet
vCapture.retrieve(imgResult); //red sheet is retrieved
我也试过:
for(int i = 0; i < 1000; i++){
vCapture.grab();
} //takes almost no processing time, like an empty for
vCapture.retrieve(imgResult); //same as before
即使自打开 vCapture 后未调用抓取,检索始终返回 true 并检索帧。
我目前的解决方案是两次检索帧(多线程)以确保最新帧,但它不够可靠,无法同步两个摄像头。谁能阐明如何强制相机抓取当前帧?
谢谢!
编辑:
为清楚起见,第一个示例的变体:
VideoCapture vCapture;
Mat imgResult;
vCapture.open(0); //at this point, there is a green sheet in front of the camera
vCapture.retrieve(imgResult); //image with green sheet is retrieved
Sleep(100000); //change green sheet with red sheet
vCapture.grab(); //returns true
vCapture.retrieve(imgResult); //green sheet is retrieved
vCapture.retrieve(imgResult); //red sheet is retrieved
Sleep(100000); //change red sheet with blue sheet
vCapture.retrieve(imgResult); //red sheet is retrieved
vCapture.retrieve(imgResult); //blue sheet is retrieved
预期行为:
VideoCapture vCapture;
Mat imgResult;
vCapture.open(0); //at this point, there is a green sheet in front of the camera
vCapture.retrieve(imgResult); //error or image with green sheet is retrieved
Sleep(100000); //change green sheet with red sheet
vCapture.grab(); //returns true
vCapture.retrieve(imgResult); //red sheet is retrieved
根据 OpenCV 文档:
VideoCapture::grab
:方法/函数从视频文件或相机中抓取下一帧,并在成功时返回 true(非零)。
VideoCapture::retrieve
:方法/函数解码并返回刚刚抓取的帧。如果没有抓取帧(相机已断开连接,或者视频文件中没有更多帧),方法返回 false,函数返回 NULL 指针。
最佳答案
请按照以下说明尝试此代码:
在启动程序之前和期间,在镜头前拿一张红纸。那一刻,第一个 .grab 将被调用。
一旦看到弹出的黑色窗口,请取下红色纸,并在相机前拿一张蓝色纸或其他东西(红色或绿色纸除外)。然后按键盘键“q”。
现在您有 5 秒的时间再次改变场景。按住镜头前的绿纸并等待。黑色窗口将切换到您的相机图像之一。
int main(int argc, char* argv[])
{
cv::Mat input = cv::Mat(512,512,CV_8UC1, cv::Scalar(0));
cv::VideoCapture cap(0);
while (cv::waitKey(10) != 'q')
{
cap.grab();
cv::imshow("input", input);
}
cv::waitKey(5000);
cap.retrieve(input);
cv::imshow("input", input);
cv::waitKey(0);
return 0;
}
3 种可能的结果:
您会看到红色表格:这意味着调用了第一次抓取并修复了图像,直到调用了检索。
您会看到蓝表:这意味着每次 .grab 调用都会“删除”一张图像,而相机将在下一次调用 .grab 时捕获一张新图像
您会看到绿页:这意味着您的 .retrieve 根本不需要 .grab,只是自动抓取图像。
对我来说,结果 1 出现了,所以你不能抓啊抓啊抓啊抓,只是.检索最后一张图像。
测试 2:控制一切:
.retrieve
和调用时捕获的图像.grab
似乎根本不影响捕获的时间位置。不同(所有)类型的相机和操作系统是否会出现相同的行为,这将非常有趣。
我已经在 T450s 和 Windows 7 的内置摄像头上进行了测试。
int main(int argc, char* argv[])
{
cv::Mat input = cv::Mat(512,512,CV_8UC1, cv::Scalar(0));
cv::VideoCapture cap(0);
bool grabbed;
bool retrieved;
while (true)
{
char w = cv::waitKey(0);
switch (w)
{
case 'q': return 0;
case 27: return 0;
case ' ': retrieved = cap.retrieve(input); break;
case 'p': grabbed = cap.grab(); break;
}
cv::imshow("input", input);
}
return 0;
}
此外,对于我的相机来说,这个简单的代码似乎偏离了 1 帧(因此它的缓冲区大小可能为 2??):
while (true)
{
cap >> input;
cv::imshow("input", input);
cv::waitKey(0);
}
关于c++ - OpenCV grab 在网络摄像头上什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36913733/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!