CHUSEI 3D Webcam摄像头双目模式使用(转载)

emm

1、网购了一个便宜的双目相机,没有什么函数可以调用来设置双目模式还是单目模式,只能通过UVC协议来进行相机的模式切换,研究了一下好像可以结合libusb库发送相关指令来实现,但是没有研究出来怎么使用C++,C#实现,后续有时间再看

2、原文链接:https://www.jianshu.com/p/2ce302d588a0

转载内容

嗯,好久不写博客,因为我在忙(bu)着(xiang)写(chao)论文。为我的心理健康着想,我决定搞点东西玩玩。于是我去某宝买了这个:

12大洋买的3d摄像头

实际上这个是一种型号为DS-3DW300的日产3d摄像头,每个头最大分辨率为640x480,最大帧率为30fps,彩色。

焊好usb连接线并连接到ubuntu,用lsusb命令获取其usb描述符信息,可以发现:

$ lsusb -d 18e3:5031 -v
...
bFunctionClass     14 Video
...

好嘛,uvc啊,直接拿Cheese打开:

只能打开一个摄像头

你大爷的。。果然不用官方软件(CHUSEI 3D Camera)就只能打开一个头啊,而且那个软件是windows独占的。

没办法,开心的Hack吧

既然是UVC协议,先考虑SELECTOR_UNIT中有多个输入的情况。呃。。。瞄了一眼刚才lsusb获取的信息发现:

bNrInPins    1

好吧,去他大爷的uvc,还是从官方软件下手吧。切换到windows下,用BusHound抓取在软件中切换双摄像头时,usb总线上的数据:

Bus Hound 6.01 capture on Windows Vista Service Pack 1 (x64). Complements of www.perisoft.net

double

Device - Device ID (followed by the endpoint for USB devices)
(26) USB 视频设备
Length - Total transfer length
Phase - Phase Type
CTL USB control transfer
IN Data in transfer
OUT Data out transfer
Data - Hex dump of the data transferred
Descr - Description of the phase
Cmd… - Position in the captured data
Driver - Driver that submitted the command
ntoskrnl : NT Kernel & System 6.1.7601.19135 (win7sp1_gdr.160121-1718)

Device Length Phase Data Description Cmd.Phase.Ofs(rep) Driver


26.0 CTL a1 85 00 08 00 06 02 00 GET LEN 1.1.0 ntoskrnl
26.0 2 IN 02 00 … 1.2.0
26.0 CTL 21 01 00 08 00 06 02 00 SET CUR 2.1.0 ntoskrnl
26.0 2 OUT 50 ff P. 2.2.0
26.0 CTL a1 85 00 0f 00 06 02 00 GET LEN 3.1.0 ntoskrnl
26.0 2 IN 02 00 … 3.2.0
26.0 CTL 21 01 00 0f 00 06 02 00 SET CUR 4.1.0 ntoskrnl
26.0 2 OUT 00 f6 … 4.2.0

26.0 2 OUT 76 c3 v. 32.2.0
26.0 CTL a1 85 00 0a 00 06 02 00 GET LEN 33.1.0 ntoskrnl
26.0 2 IN 02 00 … 33.2.0
26.0 CTL 21 01 00 0a 00 06 02 00 SET CUR 34.1.0 ntoskrnl
26.0 2 OUT 04 00 … 34.2.0

嘿,SET CUR。。。翻出UVC协议来看了一眼,果然所有的输出数据都是SET CUR的格式。后面我又抓去了左、右以及红蓝模式切换时的数据,发现这4种情况下总线上的数据都是一样的,只有最后一个SET CUR分别穿出的是1234。

也就是说,只要我们自己构造出相应的SET CUR指令流,就可以实现摄像头工作方式的切换了!于是乎就有了下面这段脚本:

# need pyusb and python binding for opencv
# also need libusb installed
import cv2
import usb.core

cam=cv2.VideoCapture(0)

dev = usb.core.find(idVendor=0x18e3, idProduct=0x5031)
# simulate the SET_CUR sequence
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x50,0xff])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0xf6])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x25,0x00])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x5f,0xfe])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x03])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x02])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x12])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x04])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x76,0xc3])

k=0
while (k!=ord(‘q’)):
ret,frame=cam.read()
cv2.imshow(“cam_test”,frame)

k<span class="token operator">=</span>cv2<span class="token punctuation">.</span>waitKey<span class="token punctuation">(</span><span class="token number">18</span><span class="token punctuation">)</span><span class="token operator">&amp;</span><span class="token number">0xFF</span>
kv<span class="token operator">=</span>k<span class="token operator">-</span><span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">'0'</span><span class="token punctuation">)</span>
<span class="token comment">#  print(kv)</span>
<span class="token comment">#  if press 1,2,3 or 4, change the 3d camera mode</span>
<span class="token keyword">if</span> kv <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">:</span>
    dev<span class="token punctuation">.</span>ctrl_transfer<span class="token punctuation">(</span><span class="token number">0x21</span><span class="token punctuation">,</span><span class="token number">0x01</span><span class="token punctuation">,</span><span class="token number">0x0a00</span><span class="token punctuation">,</span><span class="token number">0x0600</span><span class="token punctuation">,</span><span class="token punctuation">[</span>kv<span class="token punctuation">,</span><span class="token number">0x00</span><span class="token punctuation">]</span><span class="token punctuation">)</span>

运行脚本并按下“4”,结果如下:

hack成功

可以的,把两张图压缩一半然后当成一张图通过UVC传输,跟我做的那个双摄像头差不多,不过我是利用YUV格式来隐藏两张灰度图(还是我的强一点哈哈哈哈哈哈哈哈哈(。ì _ í。))。

玩完收工,憋论文去~~

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以编写一个存储过程来执行这个查询。下面是一个示例: ```sql CREATE OR REPLACE PROCEDURE get_data AS BEGIN -- 创建临时表来保存结果 CREATE GLOBAL TEMPORARY TABLE temp_data ( order_id NUMBER, done_date DATE, cust_id NUMBER, subscriber_ins_id NUMBER, access_num VARCHAR2(100), dev_id NUMBER, dev_name VARCHAR2(100), corp_org VARCHAR2(100), company_name VARCHAR2(100), department_code VARCHAR2(100), department_name VARCHAR2(100), remarks VARCHAR2(100) ) ON COMMIT PRESERVE ROWS; -- 第一个查询 INSERT INTO temp_data SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM JOUR1.Om_Subscriber_202301 a LEFT JOIN JOUR1.om_order_202301 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id; -- 后续查询使用UNION ALL连接 INSERT INTO temp_data SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM JOUR1.Om_Subscriber_202302 a LEFT JOIN JOUR1.om_order_202302 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id; INSERT INTO temp_data SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM JOUR1.Om_Subscriber_202303 a LEFT JOIN JOUR1.om_order_202303 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id; INSERT INTO temp_data SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM JOUR1.Om_Subscriber_202304 a LEFT JOIN JOUR1.om_order_202304 b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id; -- 查询结果 SELECT * FROM temp_data; -- 删除临时表 DROP TABLE temp_data; END; / ``` 这个存储过程创建了一个临时表 `temp_data` 来保存查询结果,并将每个查询的结果插入到临时表中。最后,通过查询 `temp_data` 表来获取结果。 请注意,根据你的实际需求和数据库结构,你可能需要修改表和列的定义,以及查询的逻辑。确保在执行存储过程之前,已经创建了所需的表和索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值