问题:
今天在进行RM的装甲板PnP解算时,调用solvePnP函数会报错,如图
terminate called after throwing an instance of 'cv::Exception’what(): OpenCV(4.4.0) /home/bozhi/Desktop/opencv-4.4.0/modules /calib3d/src/solvepnp.cpp:753: error: (-215:Assertion failed) ( (npoints >= 4) || (npoints == 3 && flags == SOLVEPNP_ITERATIVE && useExtrinsicGuess) ) && NPOINTS == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) in function ‘solvePnPGeneric’
Abort ed (core dumped)
solvePnP(obj,pnts,cam,dis,rVec,tVec);//调用函数
解决方法:
我的程序报错的一个特殊点在于,调用的视频播放一会儿后忽然报错,打开的imshow窗口也就关掉了。
当我逐帧查看后,发现报错前最后一帧的imshow窗口识别出了两个装甲板,因此存储”图像坐标“的vector(也就是语句中的pnts)有八个点,超维了。
于是更改pnts.clear()
语句的位置后,即可正常运行。
反思:
在网上查了好久资料,大部分资料是说定义的vector数据类型有误而非超了点数量。哎,粗心的逻辑错误是程序设计的一个大问题。