opencv的使用——经典大坑

视频或相机中读入的帧数不对,或有空帧

image check from cap or video:
you must check wether each frame is not empty when use VideoCapture. Like :

if(!image.empty())
{}

+0

这个bug你早晚会碰到的

Mat::rowRange  ||  mat::.row      // "+0" !!!
	////R(3,:) = cross(R(1,:),R(2,:));
	//R_out.rowRange(0, 2) = R.rowRange(0, 2) + 0;	// "+0" !!!
	//R_out.row(2) = R.row(0).cross(R.row(1)) + 0;	// "+0" !!!

Python Open CV perspectiveTransform()

Error: Assertion failed (scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F)) in perspectiveTransform, file /tmp/opencv-PEaA0A/opencv-2.4.9/modules/core/src/matmul.cpp, line 1936

解决

  • 将数据类型转换为np.float32
  • 将第一个参数由两通道转换为3通道

refer1
refer2

相机标定

drawchess的结果的第一列的点为宽度,点的列数为高度

opencv转换视频格式

VideoWriter writer(“object.avi”, CV_FOURCC(‘M’,’P’,’4’,’2’), 20.0, Size(640, 480));
CV_FOURCC(‘M’,’P’,’4’,’2’)设置成这样, 不然生成生.avi转换成的.mp4会有问题

cvAbsDiff

调用opencv中cvAbsDiff提示matrix.cpp:880: error: (-5) Unknown array type in file
查了很久才知道,原来在opencv3.0中的背景差分函数不是cvAbsDiff()
而是 absdiff(backgroundImage, currentImajge, foreground);
opencv版本多而杂乱,而且有C++/C的用法也不一样,千万注意

SurfFeatureDetector

调用SurfFeatureDetector 类提示没有声明,其实是该类声明于opencv2/nonfree/features2d.hpp文件中,而我们默认的声明文件opencv2/features2d.hpp,所以有些非开源免费使用的函数检测不到。解决方法#include <opencv2/nonfree/features2d.hpp>
类似的问题还有,使用BruteForceMatcher<L2> matcher 需要 include <opencv2/legacy/legacy.hpp>

Codeblocks运行opencv导入库

codeblocks运行opencv 参考
提示 undefined reference to symbol '_ZN2cv6imreadERKNS_6StringEi'
解决:文中有一步是把highgui.so opencvcore.so两个库添加到工程,而我们需要把所有含open.so的库都添加进来。
Error: invalid initialization of non-const reference of type ‘cv::Mat &’ from an rvalue of type ‘cv::Mat’

for( )
	…
	Cv::Mat &W = m_W.rowRange(2*frm, 2*frm + 2);   // error from here!
	Modify_W_function( W); // the parameter in function is needed for reference
	…
end

Solution:

cv::Mat W = m_W.rowRange(2*frm, 2*frm + 2);

直观上理解,因为Modify_W_function要修改m_W的其中两行,所以应该返回一个引用类型的值,但是mat::rowRange()的返回值并非引用,所以会报这个错。
解决方法是把返回值赋给一个矩阵,但是直观上看这样再改变W的值并不会对m_W的改变。但是其实mat::rowRange()返回的是一个矩阵头,并不会重新分配内存给W,所以即使不使用引用型的W,那么W与m_w.rowRange()也是指向的是同一块内存。所以可以这么解决问题。

posted @ 2017-03-06 19:53  fariver  阅读(5573)  评论(0编辑  收藏  举报