我正在开发一个程序来处理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_WIDTH和cv.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
我正在尝试将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应用程序,其活动可以由许多片段中的一个填充.相对而言,我需要将一组数据传递给活动片段,以便它可以相应地更新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) 我正在尝试使用 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) 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)
该文档似乎没有对这个问题提供任何说明
我正在编写一个使用 `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)