zoukankan      html  css  js  c++  java
  • 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()也是指向的是同一块内存。所以可以这么解决问题。

  • 相关阅读:
    JSP实现数据传递(web基础学习笔记三)
    Spring Boot 参数校验
    Spring AOP实践
    Spring AOP介绍
    2018年春节
    InnoDB索引
    Kafka基本知识回顾及复制
    Kakfa消息投递语义
    Kafka Consumer
    Kafka Producer Consumer
  • 原文地址:https://www.cnblogs.com/fariver/p/6511612.html
Copyright © 2011-2022 走看看