Ошибка OpenCV: утверждение не выполнено (a_size.width == len)

Фон

В настоящее время я пытаюсь создать автономный гудок, используя ROS на моем Rapsberry Pi, который работает с Ubuntu MATE 16.04 LTS . Решение проблемы компьютерного видения распознавания красных кругов на данный момент. Поскольку по своей природе гудок нестабилен (так как есть внутренний ПИД-регулятор, стабилизирующий гул), и из-за условий освещения дрон часто обнаруживает один и тот же круг, но очень неустойчивым образом. Чтобы решить эту проблему, комментарии к [этому] [1] вопросу предложили мне попробовать стабилизацию видео.

ошибка

Это ошибка, на которую я сейчас смотрю:

OpenCV Error: Assertion failed (a_size.width == len) in gemm, file /tmp/binarydeb/ros-kinetic-opencv3-3.1.0/modules/core/src/matmul.cpp, line 900 terminate called after throwing an instance of 'cv::Exception' what(): /tmp/binarydeb/ros-kinetic-opencv3-3.1.0/modules/core/src/matmul.cpp:900: error: (-215) a_size.width == len in function gemm 

Код

 class Tracker { cv::Mat prevGray; vector trackedFeatures; void processImage(const sensor_msgs::ImageConstPtr& msg) { // ROS declarations cv_bridge::CvImagePtr cv_ptr; // Function Initializations if (freshStart == true) { cv::Mat rightTransform = cv::Mat::eye(3,3,CV_32FC1); } cv::Mat gray; cv::Mat copy_img; vector corners; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_INFO("cv_bridge exception"); return; } copy_img = cv_ptr->image; cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY); if (trackedFeatures.size() < 200) { cv::goodFeaturesToTrack(gray,corners,200,0.01,10); for (int i = 0; i < corners.size(); ++i) { trackedFeatures.push_back(corners[i]); } } if (!prevGray.empty()) { vector status; vector errors; calcOpticalFlowPyrLK(prevGray, gray, trackedFeatures, corners, status, errors, Size(10,10)); if (countNonZero(status) < status.size() * 0.8) { cout << "cataclysmic error\n"; rigidTransform = cv::Mat::eye(3,3,CV_32FC1); trackedFeatures.clear(); prevGray.release(); freshStart = true; return; } else { freshStart = false; } cv::Mat_ newRigidTransform = estimateRigidTransform( trackedFeatures, corners, false); cv::Mat_ nrt33 = cv::Mat_::eye(3,3); newRigidTransform.copyTo(nrt33.rowRange(0,2)); rigidTransform *= nrt33; trackedFeatures.clear(); for (int i = 0; i < status.size(); ++i) { if (status[i]) { trackedFeatures.push_back(corners[i]); } } } // Debugging to see the tracked features as of now for (int i = 0; i image, trackedFeatures[i], 3, Scalar(0,0,255), CV_FILLED); } imshow(OPENCV_WINDOW, cv_ptr->image); cv::waitKey(3); gray.copyTo(prevGray); } }; 

Теперь я знаю, что ошибка заключается в выражении gray.copyTo(prevGray) . Это связано с тем, что я не получаю ошибок, когда комментирую это.

Общая структура программы

 class Tracker { // The ROS declarations ... // Internal Declarations ... public: bool freshStart; Mat_ rigidTransform; ... Tracker():it_(nh1_) { image_sub_ = it_.subscribe("/ardrone/bottom/image_raw", 1, &Tracker::processImage, this); image_pub_ = it_.advertise("/stabImage", 1); cv::namedWindow(OPENCV_WINDOW); } ~Tracker() { cv::destroyWindow(OPENCV_WINDOW); } void processImage(const sensor_msgs::ImageConstPtr& msg) { ... } int main(int argc, char** argv) { ros::init(argc, argv, "video_stabilizer"); Tracker tr; ros::spin(); return 0; } 

Проблема, по-видимому, является матовой проблемой. Где вы инициализируете rigidTransform ?

Я думаю, вместо строки:

 cv::Mat rightTransform = cv::Mat::eye(3,3,CV_32FC1); 

тебе нужно:

 rigidTransform = cv::Mat::eye(3,3,CV_32FC1); 

Проблема не возникает, если вы комментируете gray.copyTo(prevGray) потому что без него цикл, если if (!prevGray.empty()) не запускается.