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()也是指向的是同一塊內存。所以可以這么解決問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM