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()也是指向的是同一块内存。所以可以这么解决问题。

转载于:https://www.cnblogs.com/fariver/p/6511612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值