小编Joh*_*nnB的帖子

USB摄像头:OpenCV VideoCapture返回部分帧

我正在开发一个程序来处理Ubuntu上USB摄像机的帧。目前,我在python中使用OpenCV。当我尝试使用cv2.VideoCapture对象读取框架时,只会得到部分框架

我使用的相机是Kayeton GS1M2812 USB相机,据称它符合UVC。大多数应用程序(例如奶酪)在可用的网络摄像头中列出了相机,但不显示任何帧。另一方面,Google Hangouts可以毫无问题地显示来自摄像机的实时帧。

我还可以使用成功捕获图像和视频streamer。例如:

streamer -c /dev/video1 -o capture.jpg
Run Code Online (Sandbox Code Playgroud)

最初,当我尝试使用时cv.VideoCapture,我选择了超时并且没有图像。经过一番研究,我发现重新启动uvcvideo模块可以nodrop=1使我至少从opencv获得部分帧(如上面链接的部分)。

我试图将uvcvideo超时参数设置为一个荒谬的大值,并弄乱了所有其他参数和各种怪癖,但无济于事。

我确实发现,在每次调用之前将分辨率(cv.CAP_PROP_FRAME_WIDTHcv.CAP_PROP_FRAME_HEIGHT)更改为320x240或更小会read()导致捕获整个帧,但是任何更大的分辨率都不会。

我也尝试过使用更改各种参数v4l2-ctl,但这也不起作用。

我该怎么做才能解决此问题?

这是我的python代码:

streamer -c /dev/video1 -o capture.jpg
Run Code Online (Sandbox Code Playgroud)

当我使用笔记本电脑的内置网络摄像头(通常是/dev/video0)时,此代码可以正常工作,但在使用USB摄像头时,该代码会显示局部帧。

我在Ubuntu 16.04上使用python 2.7.12和opencv 3.3.1

python webcam opencv video-capture uvc

11
推荐指数
1
解决办法
238
查看次数

Android ExifInterface saveAttributes()而不覆盖以前的数据?

我正在尝试将lat-long和其他数据写入我的自定义相机应用程序中的jpeg的Exif标头.通常,android会自动使用光圈,ISO,快门速度等数据填充标题.但是,当我手动添加创建ExifInterface实例时,请设置GPS位置SetAttributes(),然后调用SaveAttributes(); 所有其他相机数据消失.

这应该发生吗?如何在不覆盖其他所有内容的情况下添加标签?

我在其他地方看到了创建两个ExifInterfaces的示例,一个旧的(从图片中)和一个新的,并将每个填充的值从旧的复制到新的以及任何其他数据.然而,这是令人烦恼和冗长的.我想找到一个更好的解决方案.

这是我的代码:

try{ 
    ExifInterface exif = new ExifInterface(pictureFile.getAbsolutePath());
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, mGpsLocation.getLatDms());
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, mGpsLocation.getLonDms());
    exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, mGpsLocation.getAltDms());
    exif.saveAttributes(); 
} catch(IOException e){
    e.printStackTrace(); 
}
Run Code Online (Sandbox Code Playgroud)

谢谢

android jpeg exif android-camera

10
推荐指数
1
解决办法
1854
查看次数

调试时,Android findFragmentByTag返回null

背景:

我正在编写一个Android应用程序,其活动可以由许多片段中的一个填充.相对而言,我需要将一组数据传递给活动片段,以便它可以相应地更新UI.

为了获取当前片段,我调用getfragmentManager().findFragmentByTag()并将返回的片段转换为我的自定义片段类.

问题:

上述方法通常可以正常工作.但是,findFragmentByTag()偶尔会返回null.经过进一步调查,我得出的结论是,只有当我从Android工作室运行或调试时才会发生这种情况(即使这样,每次都不会发生).

相关守则:

protected void onCreate(Bundle savedInstanceState){

    //Do lots of stuff
    currentFragmentTag = "";
    getFragmentManager().addOnBackStackChangedListener(
            new FragmentManager.OnBackStackChangedListener() {
                public void onBackStackChanged() {
                    if (getFragmentManager().getBackStackEntryCount() > 0) {
                        currentFragmentTag = getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount() - 1).getName();
                    }

                }
            });
    init();

    //Do some more stuff

    //this should always be the case
    if (currentFragmentTag.equals(LOGIN_FRAGMENT_TAG)) {
        ((LoginFragment) getFragmentManager().findFragmentByTag(currentFragmentTag)).beginLogin();
    }

}


private void init(){
    //changed to reflect George Mulligan's advice
    Fragment currentFrag = getFragmentManager().findFragmentByTag(LOGIN_FRAGMENT_TAG);
    if(currentFrag == null) {
        currentFragmentTag = LOGIN_FRAGMENT_TAG; …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments android-studio

7
推荐指数
2
解决办法
1231
查看次数

集成 Android 加速计来查找速度和位置

我正在尝试使用 Android 设备上的加速度计计算位移 ( Sensor.TYPE_LINEAR_ACCELERATION)。这是我的OnSensorChanged()方法:

public void onSensorChanged(SensorEvent event) {
    accelX = event.values[0];
    accelY = event.values[1];
    accelZ = event.values[2];

    long currentTime = System.currentTimeMillis() / 1000;

    if(prevTime == 0) prevTime = currentTime;

    long interval = currentTime - prevTime;
    prevTime = currentTime;     

    velX += accelX * interval;
    velY += accelY * interval;
    velZ += accelZ * interval;

    distX += prevVelX + velX * interval;
    distY += prevVelY + velY * interval;
    distZ += prevVelZ + velZ * interval;

    prevAccelX …
Run Code Online (Sandbox Code Playgroud)

java android accelerometer

5
推荐指数
1
解决办法
3860
查看次数

Python 线程加入死线程

join()如果我调用一个已经完成的线程会发生什么?

例如

import threading
import time

def fn():
    time.sleep(1)

t = threading.Thread(target=fn)
t.start()

time.sleep(2)
t.join()
Run Code Online (Sandbox Code Playgroud)

文档似乎没有对这个问题提供任何说明

python python-multithreading

5
推荐指数
1
解决办法
2853
查看次数

TBB 并行流水线:过滤器时序不一致

我正在编写一个使用 `tbb::parallel_pipeline' 处理视频流的应用程序。我的第一个过滤器包含两个重要的操作,一个必须在另一个之后立即发生。

我的测试表明,当我设置max_number_of_live_tokens为 6(我拥有的过滤器数量)时,两次操作之间的延迟在 3 到 20 毫秒之间,但在设置max_number_of_live_tokens为 1时始终为 3 到 4 毫秒。第一种情况下的抖动对于我的应用程序来说是不可接受的,但我需要允许多个令牌同时运行以利用并行性。

这是我的管道设置:

tbb::parallel_pipeline(6, //max_number_of_live_tokens

        // 1st Filter
        tbb::make_filter< void, shared_ptr<PipelinePacket_t> >(tbb::filter::serial_in_order,
            [&](tbb::flow_control& fc)->shared_ptr<PipelinePacket_t>
                { 
                    shared_ptr<PipelinePacket_t> pPacket = grabFrame();
                    return pPacket; 
                }
            )

        & 
           ... // 5 other filters that process the image - all 'serial_in_order'

    );
Run Code Online (Sandbox Code Playgroud)

这是我的grabFrame()功能:

shared_ptr<VisionPipeline::PipelinePacket_t> VisionPipeline::grabFrame() {

    shared_ptr<PipelinePacket_t> pPacket(new PipelinePacket_t);

    m_cap >> pPacket->frame; // Operation A (use opencv api to capture frame)

    pPacket->motion.gyroDeg = m_imu.getGyroZDeg(); // Operation B …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading tbb

3
推荐指数
1
解决办法
153
查看次数