OpenCV备忘录

mat的遍历方法
refer to: https://blog.csdn.net/koibiki/article/details/85954121

如何使用opencv给视频添加水印并保存
refer to: https://blog.csdn.net/weixin_44903147/article/details/102969715

bool solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags=ITERATIVE )

objectPoints为特征点的世界坐标,特征点通常为4个,坐标值需为float型,不能为double型,可以输入mat类型,也可以直接输入vector
imagePoints为特征点在图像中的坐标,需要与前面的输入一一对应。同样可以输入mat类型,也可以直接输入vector
cameraMatrix为相机内参数矩阵,大小为3×3。事先通过OpenCV自带例程求出相机标定参数。
distCoeffs输入为相机的畸变参数,为1×5的矩阵。事先通过OpenCV自带例程求出相机标定参数。
rvec输出解得的旋转向量。
tvec输出平移向量。
useExtrinsicGuess为true后似乎会对输出进行优化。
flags:
CV_ITERATIVE,默认值,它通过迭代求出重投影误差最小的解作为问题的最优解。
CV_P3P则是使用非常经典的Gao的P3P问题求解算法。
CV_EPNP使用文章《EPnP: Efficient Perspective-n-Point Camera Pose Estimation》中的方法求解。

//最小二乘法,解A*X=B中的X
bool cv::solve(InputArray A, InputArray B, OutputArray X, int flags = DECOMP_LU)

refer to:
https://www.cnblogs.com/singlex/p/pose_estimation_1.html
https://www.csdn.net/tags/NtTakgysNTA0NDQtYmxvZwO0O0OO0O0O.html

vmware linux共享文件夹未启动

1
2
3
sudo dnf install open-vm-tools-desktop
umount /mnt/hgfs
sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=1000 -o gid=1000 -o umask=022

如果还不行,比如更新内核后,就要重新安装open-vm-tools。

refer to:
https://blog.csdn.net/xcyja/article/details/117328301

Windows平台下新的文件才拷贝

Linux下的cp -u能实现只在源文件比目标文件新时才拷贝,但此命令在MinGW下不好使,我通过在网上查方法,写了以下同样功能的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
clearBinary()
{
	local destDir=$1
	local fileName=$2
	local ext=$3
 
	rm "${destDir}/${fileName}.${ext}" 1>/dev/null 2>&1
 
	for ((j = 1; j <= 20; j++)); do
		if [ -f "${destDir}/${fileName}_$j.${ext}" ] ; then
			rm "${destDir}/${fileName}_$j.${ext}"
		fi
	done
 
	for ((j = 1; j <= 20; j++)); do
		if [ -f "${destDir}/${fileName}.${ext}" ] ; then
			mv "${destDir}/${fileName}.${ext}" "${destDir}/${fileName}_$j.${ext}"
		fi
	done
}
 
copyFile()
{
	local srcDir=$1
	local destDir=$2
	local fileName=$3
	local ext=$4
 
	local srcPath=${srcDir}/${fileName}.${ext}
	local destPath=${destDir}/${fileName}.${ext}
 
	if [ ! -f "${srcPath}" ] ; then
		return
	fi
 
	local timeFrom=`stat -c %Y "${srcPath}"`
	local timeTo=`stat -c %Y "${destPath}"`
	if [ "$timeFrom" = "$timeTo" -a "x$forceReplace" != "xforce" ]; then
		return
	fi
 
	clearBinary "${destDir}" ${fileName} ${ext}
 
	cp "${srcPath}" "${destPath}"
 
	local timeFromStr=`date -d "@$timeFrom" "+%Y-%m-%d %H:%M:%S"`
	touch -m -d "$timeFromStr" "${destPath}"
 
	echo "[${srcPath}]->[${destPath}] copied."
}
 
copyFile /e/source /c/dest hello docx

EuhatGift发布

我写的一个开源的工具库,地址:https://github.com/euhat/EuhatGift
现在包含功能:

  • Boost库里的json文件操作接口非常适合于写业务代码,但该库会把数字写成数字字符串,这是有问题的。再考虑性能及各种语言编码的兼容性,我写了一个cJSON库的c++包装类,接口类似于Boost,名叫CjsonWrapper。
  • Windows的GetPrivateProfileStringA函数要预定义接收值的Buffer大小,这是有缺点的,这会造成我们读取的值可能只读了一半我们却没有办法。我于是重写了ini操作相关的函数库,名叫IniOp,C语言风格,跨平台。

gtk user control自绘控件

ubuntu下gtk库是默认已安装的,开发部署很方便,以下是我写的自绘控件例子:

EuhatChildWnd.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
struct _cairo_surface;
struct _GtkWidget;
 
class EuhatChildWnd
{
public:
	EuhatChildWnd(int width, int height);
	~EuhatChildWnd();
 
	void clear();
	void drawBrush(struct _GtkWidget *widget, double x, double y);
 
	struct _GtkWidget *drawingArea_;
	struct _cairo_surface *surface_;
 
	double xFrom_;
	double yFrom_;
};

Read more

ntoskrnl.ExiAcquireFastMutex HAL.dll

在32位Win7操作系统里,运行引用我们编的动态库的应用程序,报如下错误:

无法定位程序输入点 ntoskrnl.ExiAcquireFastMutex 于动态链接库 HAL.dll 上。

用Dependency Walker查看我们编的动态库,发现引用了ntoskrnl.exe,猜测在旧有的32位win32环境中是不会从dll中去引用别的exe的。只有在64位win32环境中才会存在从dll中去引用ntoskrnl.exe。

32位动态库编译的解决办法:
链接器->输入->附加依赖项去除ucrt.lib和wdm.lib。
链接器->输入->忽略所有默认库设为否。
链接器->高级->入口点清空。

addr2line ??

gcc中加入编译选项

1
g++ -g -Wl,-Map=test.map -no-pie -rdynamic ...

内核设置如下

1
echo 0 > /proc/sys/kernel/randomize_va_space

addr2line

1
addr2line -e ./test -Cif 0x401425

vim+cscope

1
2
apt install vim
apt install cscope

将以下脚本保存为~/.vimrc,注意要用dos2unix转换一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
	if has("cscope")
		set csprg=/usr/bin/cscope
		set csto=0
		set cst
		set nocsverb
		" add any database in current directory
		if filereadable("cscope.out")
		    cs add cscope.out
		" else add database pointed to by environment
		elseif $CSCOPE_DB != ""
		    cs add $CSCOPE_DB
		endif
		set csverb
	endif
 
	nmap <C-[>s :scs find s <C-R>=expand("<cword>")<CR><CR>
	nmap <C-[>g :scs find g <C-R>=expand("<cword>")<CR><CR>
	nmap <C-[>c :scs find c <C-R>=expand("<cword>")<CR><CR>
	nmap <C-[>t :scs find t <C-R>=expand("<cword>")<CR><CR>
	nmap <C-[>e :scs find e <C-R>=expand("<cword>")<CR><CR>
	nmap <C-[>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
	nmap <C-[>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
	nmap <C-[>d :scs find d <C-R>=expand("<cword>")<CR><CR>
	nmap <C-[>a :scs find a <C-R>=expand("<cword>")<CR><CR>

每次源码更新时,在源码根目录执行

1
2
3
#find . -type f | cat > cscope.files
#find . -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" > cscope.files
cscope -bqR