我有一个物体的3D世界坐标,我想在相机2D平面上得到它的坐标.我已经使用了相机校准cv::calibrateCamera,因此我有相机矩阵和distortionCoeffs.
为了将3D点投影到2D摄像机坐标,我使用cv::projectPoints.文件说:
void projectPoints(InputArray objectPoints,InputArray rvec,InputArray tvec,InputArray cameraMatrix,InputArray distCoeffs,OutputArray imagePoints,OutputArray jacobian = noArray(),double aspectRatio = 0)
我如何获得rvec/tvec并且我的方法是正确的?calibrateCamera给我rvecs和tvecs,但他们每个输入棋盘的图像,我想,他们是相机的旋转和棋盘的翻译,而不是.
我需要在复杂的字符串\\中用\python3 替换.我知道这个问题已被多次询问过,但大部分时间都是针对简单的字符串,所以(接受的)答案都不适用于复杂的字符串.
这也是不同的,从这个地方的问题可以用来解决.decode('unicode_escape')这对于这个问题无法正常工作.见下文.
假设字符串是:
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Run Code Online (Sandbox Code Playgroud)
直接的方法是:
my_str.replace('\\','\')
Run Code Online (Sandbox Code Playgroud)
这导致:
SyntaxError:扫描字符串文字时的EOL
这个答案建议使用:
my_str.replace('\\\\','\\')
Run Code Online (Sandbox Code Playgroud)
结果如下:
'\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Run Code Online (Sandbox Code Playgroud)
所以,没有变化.
这个答案表明:
b = bytes(my_str, encoding='utf-8')
b.decode('unicode-escape')
Run Code Online (Sandbox Code Playgroud)
但是这对于这样一个复杂的字符串不起作用:
UnicodeDecodeError:'unicodeescape'编解码器无法解码位置49-50中的字节:截断\ xXX转义
使用解码(如此处所示)会导致:
my_str.decode('unicode_escape')
Run Code Online (Sandbox Code Playgroud)
AttributeError:'my_str'对象没有属性'decode'
编码和解码的组合使用unicode_esacpe返回一个完全不同的字符串(可能是由于使用utf-16,但utf-8导致错误,见上文.另外,例如latin1,不起作用):
my_str.encode('utf-16').decode('unicode_escape')
'ÿþ\\\x00x\x00a\x005\x00\\\x00x\x00c\x000\x00\\\x00x\x00e\x006\x00a\x00K\x00\\\x00x\x00f\x009\x00\\\x00x\x008\x000\x00\\\x00x\x00b\x001\x00\\\x00x\x00c\x008\x00*\x00\x01\x00\x12\x00$\x00\\\x00x\x00f\x00b\x00p\x00\x1e\x00(\x004\x00\\\x00x\x00d\x006\x00{\x00;\x00Z\x00\\\x00x\x00'
Run Code Online (Sandbox Code Playgroud)
当我在Visual Studio 2015中运行我的应用程序时,我在诊断工具中看到进程内存已达到2GB - 就好像有一个限制:
我读过,执行是为了x32限制可用内存,所以必须使用x64.所以我构建relase, x64了上面显示的结果.如何删除此"限制"?
注意:我有16GB Ram硬件(操作系统:Windows 10).
我std::mutex在我的多线程应用程序中使用a 来通过多个线程访问相同的资源.这很好用.但在我的代码的某些时候,我必须使用终止线程TerminateThread(...).当我再次开始线程(使用_beginthreadex)时,如果其中一个线程在终止时处于互斥锁定状态,则会出现异常:
并发:: improper_lock bei Speicherort 0x03B4F3D0.
这是在rtlocks.cpp,第1184行(in bool critical_section::_Acquire_lock)中抛出的:
LockQueueNode * pPrevious = reinterpret_cast<LockQueueNode *>(InterlockedExchangePointer(&_M_pTail, pNewNode));
Run Code Online (Sandbox Code Playgroud)
我想,如果我可以"重置"互斥锁,我会得到一个例外,对吗?我怎样才能做到这一点?
(我用<process.h>)
编辑
我尝试了以下方法:
std::mutex dataStorage_lock;
mutexHandler[0] = &dataStorage_lock; //storing all mutexs in an array
//when trying to delete:
delete mutexHandler[0];
Run Code Online (Sandbox Code Playgroud)
但我得到:
调试断言失败!
表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)
给定一个随机字节(即不仅是数字/字符!),我需要将其转换为字符串,然后在不丢失信息的情况下返回初始字节。这似乎是一项基本任务,但我遇到了以下问题:
假设:
rnd_bytes = b'w\x12\x96\xb8'
len(rnd_bytes)
Run Code Online (Sandbox Code Playgroud)
印刷: 4
现在,将其转换为字符串。注意:我需要设置backslashreplace,否则它会返回“UnicodeDecodeError”,否则会丢失将其设置为另一个标志值的信息。
my_str = rnd_bytes.decode('utf-8' , 'backslashreplace')
Run Code Online (Sandbox Code Playgroud)
现在,我有了字符串。我想将它转换回原来的字节(大小为 4!):
根据 python 资源和这个答案,有不同的可能性:
conv_bytes = bytes(my_str, 'utf-8')
conv_bytes = my_str.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
但是 len(conv_bytes) 返回10.
我试着分析结果:
>>> repr(rnd_bytes)
"b'w\\x12\\x96\\xb8'"
>>> repr(my_str)
"'w\\x12\\\\x96\\\\xb8'"
>>> repr(conv_bytes)
"b'w\\x12\\\\x96\\\\xb8'"
Run Code Online (Sandbox Code Playgroud)
更换'\\\\'. my_str.replace('\\\\','\\')不会改变任何东西。可能是因为四个反斜杠只代表两个。所以,my_str.replace('\\','\')会找到'\\\\',但是会导致
语法错误:扫描字符串文字时 EOL
由于最后一个论点'\'。这已经在这里讨论过,其中提出了以下建议:
>>> my_str2=my_str.encode('utf_8').decode('unicode_escape')
>>> repr(my_str2)
"'w\\x12\\x96¸'"
Run Code Online (Sandbox Code Playgroud)
这取代了'\\\\'但似乎添加/更改了一些其他字符:
>>> conv_bytes2 = …Run Code Online (Sandbox Code Playgroud) 我想安装systemd(github)库。
但是,执行
sudo pip3 install systemd
Run Code Online (Sandbox Code Playgroud)
导致此错误:
命令“ /usr/local/bin/python3.6 -u -c”导入setuptools,标记化;file ='/ tmp / pip-install-c97m6cn0 / systemd / setup.py'; f = getattr(tokenize,'open',open)(file); code = f.read()。replace('\ r \ n ','\ n'); f.close(); exec(compile(code,file,'exec')))“ install --record /tmp/pip-record-gqnrg4wd/install-record.txt --single-版本外部管理的--compile“在/ tmp / pip-install-c97m6cn0 / systemd /中失败,错误代码为1
我试图升级setuptools,但这不能解决我的问题:
sudo pip3 install --upgrade setuptools
Run Code Online (Sandbox Code Playgroud)
这里是完整的控制台输出:
$ sudo pip3 install systemd Collecting systemd
使用缓存的 https://files.pythonhosted.org/packages/d4/c2/2195b049effd866b5d26926e672be83fc6f3263aa71ea0639e8eab44851e/systemd-0.16.1.tar.gz 为收集的软件包构建轮子:systemd为systemd运行setup.py bdist_wheel ...错误完整的输出结果命令/ usr / bin / python3 -u -c“导入setuptools,标记化;文件 ='/ tmp …
我想使用OpenCV 3.0文档站点上描述的跟踪器.在OpenCV 2.x中,有必要重新编译OpenCV,包括contrib库.但正如在OpenCV 3文档中那样,我想我不必再重新编译它了,对吧?但是我在C++中有什么#include?
我试图这样做退出一段时间,但没有找到任何解决方案.谢谢!
编辑 谢谢!重新编译过程对我没有任何错误.我还有几个错误:他找不到'opencv_highgui300d.dll','opencv_imgcodecs300d.dll'和'opencv_core300d.dll'.
我解决了这个问题,因为我必须将'Path'系统变量更改为
...\cmake-output\vc12\x86\install\x86\vc12\bin
我想在python3中生成一个16字节长的随机字符串用于加密目的(AES加密)。urandom(n)似乎是获得真正随机字符的方法:
os.urandom(n):
返回适合加密使用的 n 个随机字节字符串。
由于我需要一个 16 字节的随机字符串,我认为这对我有用:编辑我现在包含了一个更复杂的示例,演示了我遇到的问题。
from os import urandom
from Crypto.Cipher import AES
from base64 import b64encode
import sys
rnd=urandom(16)
rnd_bytes=b64encode(rnd).decode('utf-8')
print(sys.getsizeof(rnd_bytes))
print(len(rnd_bytes))
print(type(rnd_bytes))
AESencrypter=AES.new('my key',AES.MODE_CBC,rnd_bytes)
Run Code Online (Sandbox Code Playgroud)
注意:我使用此答案将 urandom字节转换为string。输出是:
73
24
文件“/User/test.py”,第 14 行,在 AESencrypter=AES.new('my kes',AES.MODE_CBC,rnd_bytes) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3. 6/site-packages/Crypto/Cipher/AES.py", line 95, in new return AESCipher(key, *args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3 .6/site-packages/Crypto/Cipher/AES.py”,第 59 行,在init blockalgo.BlockAlgo 中。init (self, _AES, key, *args, **kwargs) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Crypto/Cipher/blockalgo.py”,行141、在init self._cipher = factory.new(key, *args, …