对于那些发现它太长的人,只需阅读粗线.
我的基于视线估计的屏幕光标移动HCI的项目现在依赖于最后一件事 - 凝视估计,其中我使用眼角作为参考稳定点,相对于该参考稳定点,我将检测瞳孔的移动并计算凝视.
但我无法从现场网络摄像头视频中稳定地检测到眼角.我一直在使用cv.CornerHarris()和GFTT - cv.GoodFeaturesToTrack()函数进行角点检测.我直接在我的眼睛图像上尝试了FAST演示(来自他们网站的可执行文件),但这并不好.
这些是我到目前为止对图像的角落检测的一些结果.
使用GFTT:

使用哈里斯:

视频中会发生什么:
绿色的cirlces是角落,其他(粉红色,较小的圆圈)是其他角落
我使用了某种启发式方法 - 如果垂直思考,角落将位于左侧或右侧极端,并且位于中间位置.我之所以这样做,是因为在许多条件下拍摄了许多快照后,除了不到5%的图像外,休息就像这些一样,对于他们来说,上面的启发式算法仍然存在.
但是这些眼角检测用于快照 - 而不是来自网络摄像头.
当我使用方法论(哈里斯和GFTT)进行网络摄像头输入时,我只是没有得到它们.
现在我在两种方法中使用的参数 - 它们不显示不同照明条件的结果,显然.但是在与拍摄这些快照的照明条件相同的情况下,我仍然没有得到我从网络摄像头视频查询的帧的结果
来自GFTT的这些参数适用于平均照明条件
cornerCount = 100
qualityLevel = 0.1
minDistance = 5
Run Code Online (Sandbox Code Playgroud)
而这些:
cornerCount = 500
qualityLevel = 0.005
minDistance = 30
Run Code Online (Sandbox Code Playgroud)
适用于上面显示的静态图像
minDistance = 30因为很明显,角落至少有这么远的距离,再次,我从我的按扣中看到了一种趋势.但我把它降低为GFTT的网络摄像头饲料版本,因为那时我根本没有任何角落.
此外,对于GFTT的实时馈送版本,我需要进行一些小改动:
cv.CreateImage((colorImage.width, colorImage.height), 8,1)
Run Code Online (Sandbox Code Playgroud)
而对于静止图像版本(pastebin上的代码),我用过:
cv.CreateImage(cv.GetSize(grayImage), cv.IPL_DEPTH_32F, 1)
Run Code Online (Sandbox Code Playgroud)
注意深度.
这会改变任何检测质量吗?
我通过GFTT方法的眼睛图像没有32F的深度所以我不得不改变它并根据其他临时图像(eignenimg,tempimg等)
底线:我要完成凝视估计,但没有稳定的眼角检测,我无法进展..而且我要继续眨眼检测和模板匹配基于瞳孔跟踪(或者你知道更好吗?).简单来说,我想知道我是否犯了任何新手的错误,或者做了阻止我在我的网络摄像头视频流中获得近乎完美的眼角检测的事情,我在这里发布了我的快照.
无论如何,谢谢你给这个观点.任何想法如何为各种照明条件执行眼角检测将是非常有帮助的
好吧,如果你没有得到我在我的代码中做的事情(我如何获得左右角),我将解释:
max_dist = 0
maxL = …Run Code Online (Sandbox Code Playgroud) python opencv image-processing computer-vision eye-detection
到目前为止,我已经能够准确地检测出瞳孔和眼角.您可以在我的回答中看到我上传的一些快照:
这是我到目前为止所做的.我通过查看TLCP,TRCP和BLCP来校准用户的凝视
CP = calibration point; a screen point used for calibration
B = bottom
T = top
L= left
R = right
gaze_width = TRCP.x - TLCP.x
gaze_height = BLCP.y- TLCP.y
Run Code Online (Sandbox Code Playgroud)
通过查看这些CP得到的相应凝视点称为GP
计算凝视点GP:
我从当前瞳孔中心的位置减去TLGP的纵坐标值,因为凝视点必须落在假设的矩形中,我希望你理解它,它真的非常简单.
我已经使用基本缩放系统将从瞳孔中心位置计算的凝视点线性映射到屏幕点,其中比例计算如下:
scaleX = screen_width/gaze_width
scaleY = screen_height/gaze_height
Run Code Online (Sandbox Code Playgroud)
并且对于任何凝视点P(x,y),我将相应的屏幕点Q(m,n)计算为:
m = scaleX*x
n = scaleY*y
Run Code Online (Sandbox Code Playgroud)
但问题是,即使几乎完美的瞳孔检测(几乎是因为在光线不足的情况下,它会产生误报.但我打算将其置于限制之下,因为我无法使用它,我没有足够的时间),我仍然会得到较差的注视宽度和注视高度.
这是一个测试运行日志:
DO_CAL= True
Gaze Parameters:
TLGP = (38, 26) | TRGP = (20, 22) | BLGP = (39, 33)
screen height = 768 screen width = 1366
gaze height …Run Code Online (Sandbox Code Playgroud) opencv image-processing human-computer-interface computer-vision eye-tracking
意见#18,在20个有争议的编程意见中
让我思考.所以我尝试将pi的值打印到5位小数.
没关系,因为我认为我绝对可以用Python快速完成.在Google上几秒钟我就知道了Python的Decimal模块.我完成了.休息是基本逻辑,任何人都可以拿出来总结系列以获得Pi的价值.
>>>from decimal import *
>>>getcontext().prec = 6
>>>Decimal(22)/Decimal(7)
Run Code Online (Sandbox Code Playgroud)
我写了上面的快速脚本只是为了检查我会得到什么.
但这就是事情,getcontext().prec = 6给了我一个圆润的价值!
>>>3.14286
Run Code Online (Sandbox Code Playgroud)
确切地说.
我想知道如何确保小数点后的第N个位置没有四舍五入?我的意思是,我希望答案是3.14285
Java是否可以调用任何系统调用或操作系统特定的函数来获取所连接的USB设备的名称?
我在这里只看到了6到7个问题,但每个人都提到了C++函数GetRawInputDeviceList()等,而且它们不符合跨平台的要求.适用于C#或C++中的Windows或仅适用于Linux.
但我在Java工作.此外,这需要跨平台.至少,它需要适用于Windows,Linux和Mac.我也可以使用terminal/shell/command-prompt命令.我想我可以用Java运行它们.
我试过getFileSystemView和listRoots.但是他们给出了所有驱动器的名称[dvd,hdd分区,软盘等].
我只需要USB设备.
请不要提及jUSB或JSR080.为什么:
jUSB: 访问USB设备目前要求它们连接到GNU/Linux主机系统
javax.usb: pre-alpha Windows实现未经过认证,需要内核驱动程序.
usb4java: 基本上,它只是实现了JSR80而不是更多的抽象
虽然老实说我还没有尝试过libusb,因为它是用C++编写的.
如果您要提及API,请提及完全经过测试和尝试过的API,它们可以在Linux,Windows和Mac上运行.如果情况并非如此,我不会提出这个问题.我在很多其他帖子上看到了jUSB,javax.usb等的提及.
在我的应用程序中:
我跟踪一个对象。
获取它corners在此框架中的位置。
我找到了corners从最后一帧到当前帧的单应性。
使用单应做一个perspectiveTransform对corners
当前帧中找到,拿到transformed_corners。
使用transformed_corners来查找它们和之间的单应性overlay_image。
将以上单应性M应用于overlay_image,以获取warped_image使用warpPerspective的信息。这是最慢的部分。
然后使用遮罩操作,将打印机打印warped_image到找到对象的当前帧上。
现在,在这里阅读此博客文章后,我知道为什么warpPerspective速度慢。
而由于上述warpPerspective,我在上述第6步中获得了每帧300ms的传输速度。这严重影响了我的应用程序的FPS输出。基本上,它从12帧/秒下降到2帧/秒,而不会在每个帧上变形。
有没有其他更快的选择?使用NDK r9在Android上完成所有操作。有哪些快速的替代方法,以及将翘曲时间从300ms减少到50ms以下的优化方法?
我已经在 Python 和 C++ 中使用 OpenCV 完成了图像变形,在我选择的角落看到了变形的可口可乐标志:
使用以下图像:
和这个:
我需要这样做,但在 OpenGL 中。我会有:
我必须在其中映射扭曲图像的角落
一个单应矩阵,将徽标图像的变换映射到您在最终图像中看到的徽标图像(使用 OpenCV 的 warpPerspective),如下所示:
[[ 2.59952324e+00, 3.33170976e-01, -2.17014066e+02],
[ 8.64133587e-01, 1.82580111e+00, -3.20053715e+02],
[ 2.78910149e-03, 4.47911310e-05, 1.00000000e+00]]
Run Code Online (Sandbox Code Playgroud)主图(这里是跑步轨迹图)
叠加图像(此处为可口可乐图像)
是否可以 ?我已经阅读了很多并开始了 OpenGL 基础教程,但是可以从我所拥有的内容中完成吗?OpenGL 实现会更快吗,比如大约 10 毫秒?
我目前正在使用本教程:http : //ogldev.atspace.co.uk/www/tutorial12/tutorial12.html 我是否朝着正确的方向前进?这里是 OpenGL 新手,请多多包涵。谢谢。
从这里 - 分支预测问题,我开始编写程序的Python版本来检查Python中已排序/未排序版本的运行时.我先尝试排序.
这是代码:
import time
from random import *
arraysize = 327
data = []
for c in range(arraysize):
data.append( randint( 1 , 256 ) )
## !!! with this, the next loop runs faster
data.sort()
## test
start_time = time.clock()
sum = 0
for i in range(100000):
for c in range(arraysize):
if data[c] >= 128:
sum += data[c]
print time.clock() - start_time
Run Code Online (Sandbox Code Playgroud)
我不确定我的简单时序方法的准确性,但似乎已经足够了.当我设置时,arraysize = 32768我第一次等待> 20分钟!超过20分钟!但是arraysize = 327,我有时间8.141656691s.
如果我的代码中某处出错,请纠正我,或者在某种程度上使用Numpy/Scipy会加快速度.谢谢.
我刚开始。
每次我在模拟器上运行项目时,我都试图增加一个简单的计数器。
我想增加一个integer类型item中strings.xml会有所帮助,但这是最终的,并且不能被修改。
基本上我只是在我的应用程序的第一个基本屏幕中显示:
Started: N 其中 N 将是我从 Eclipse 启动该项目的第 N 次。
我怎样才能制作这样一个在应用程序启动和退出时持续存在的计数器?
知道了:
SharedPreferences pref = getPreferences(MODE_PRIVATE);
int tempN=pref.getInt("N", 0);
tempN++;
SharedPreferences.Editor editor = pref.edit();
editor.putInt("N",tempN);
editor.commit();
msgBox.setText("Started:"+tempN);
Run Code Online (Sandbox Code Playgroud)
我仍然不明白的一件事pref.getInt("N",0)是,当我调用 时,键值对是<N,0>自动创建的吗?
我双击,没有任何反应.
我从起泡器上打开了cmd,做了:
java gdx-setup-ui.jar
我得到了:
Error: Could not find or load main class gdx-setup-ui.jar
Run Code Online (Sandbox Code Playgroud)
我最近更新了JRE,到1.7.0_45,JDK是1.6.0_18
我以前也习惯创建libgdx项目,它曾经工作过.我正在使用Windows Vista.
我需要使用 grequests 发出异步 POST 请求。
我的帖子正文(在 json 中)是这样的:
[{'params': {'source': 'widget',
'id': 'http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif',
'groupId': '@self',
'nolog': 'true',
'userId': '@viewer'},
'method': 'pos.plusones.get',
'id': 'p',
'jsonrpc': '2.0',
'apiVersion': 'v1',
'key': 'p'}]
Run Code Online (Sandbox Code Playgroud)
[0]['params']['id']对于我将要发布的许多帖子,我需要将密钥的值更改为不同的 URL。
所以我在做:
myrequests = (grequests.post(POST_URL, data=fgp(a_url) for a_url in all_urls)
将fgp()在我的理解产生的方法是改变的方法[0]['params']['id']对a_url传递给它,在POST身体我送。
当我将请求映射到响应时:
myresponses = grequests.map(myrequests)
这就是我得到的,次数与请求一样多(显然)。
Traceback (most recent call last):
File "/home/ashk/.virtualenvs/cosignp3/src/gevent/gevent/greenlet.py", line 340, in run
result = self._run(*self.args, **self.kwargs)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/grequests.py", line 71, in send
self.url, **merged_kwargs)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/requests/sessions.py", line 451, …Run Code Online (Sandbox Code Playgroud) opencv ×4
python ×4
android ×3
c++ ×2
homography ×2
java ×2
android-ndk ×1
decimal ×1
eye-tracking ×1
grequests ×1
installation ×1
libgdx ×1
opengl-es ×1
optimization ×1
python-3.x ×1
usb ×1