From 4364e187ceaffea9a4baef2446f45aa314f2434a Mon Sep 17 00:00:00 2001 From: Brenno Date: Fri, 26 Jun 2020 21:28:30 -0300 Subject: [PATCH] integrated Qimage to Mat conversion into Frame --- include/Frame.h | 18 ++++++++++++++++-- src/Frame.cpp | 25 +++++++++++++++++++++++++ src/examples/Example_opencv.cpp | 25 +------------------------ 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/include/Frame.h b/include/Frame.h index f4ff54d44..9d2e881b3 100644 --- a/include/Frame.h +++ b/include/Frame.h @@ -26,11 +26,18 @@ * * You should have received a copy of the GNU Lesser General Public License * along with OpenShot Library. If not, see . - */ + */ #ifndef OPENSHOT_FRAME_H #define OPENSHOT_FRAME_H + +#define int64 opencv_broken_int +#define uint64 opencv_broken_uint +#include +#undef uint64 +#undef int64 + #include #include #include @@ -107,6 +114,7 @@ namespace openshot { private: std::shared_ptr image; + cv::Mat imagecv; std::shared_ptr wave_image; std::shared_ptr audio; std::shared_ptr previewApp; @@ -157,7 +165,7 @@ namespace openshot /// Add (or replace) pixel data to the frame void AddImage(int new_width, int new_height, int bytes_per_pixel, QImage::Format type, const unsigned char *pixels_); - + /// Add (or replace) pixel data to the frame void AddImage(std::shared_ptr new_image); @@ -226,6 +234,9 @@ namespace openshot /// Get pointer to Qt QImage image object std::shared_ptr GetImage(); + /// Get pointer to OpenCV Mat image object + cv::Mat GetImageCV(); + #ifdef USE_IMAGEMAGICK /// Get pointer to ImageMagick image object std::shared_ptr GetMagickImage(); @@ -286,6 +297,9 @@ namespace openshot /// Play audio samples for this frame void Play(); + + /// Convert Qimage to Mat + cv::Mat Qimage2mat( std::shared_ptr& qimage); }; } diff --git a/src/Frame.cpp b/src/Frame.cpp index 764b9651a..2fb6d48de 100644 --- a/src/Frame.cpp +++ b/src/Frame.cpp @@ -925,6 +925,31 @@ std::shared_ptr Frame::GetImage() return image; } +// Convert Qimage to Mat +cv::Mat Frame::Qimage2mat( std::shared_ptr& qimage) { + + cv::Mat mat = cv::Mat(qimage->height(), qimage->width(), CV_8UC4, (uchar*)qimage->bits(), qimage->bytesPerLine()); + cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); + int from_to[] = { 0,0, 1,1, 2,2 }; + cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 ); + return mat2; +}; + +// Get pointer to OpenCV image object +cv::Mat Frame::GetImageCV() +{ + // Check for blank image + if (!image) + // Fill with black + AddColor(width, height, color); + + if (imagecv.empty()) + // Convert Qimage to Mat + imagecv = Qimage2mat(image); + + return imagecv; +} + #ifdef USE_IMAGEMAGICK // Get pointer to ImageMagick image object std::shared_ptr Frame::GetMagickImage() diff --git a/src/examples/Example_opencv.cpp b/src/examples/Example_opencv.cpp index 69b44d03a..daec00530 100644 --- a/src/examples/Example_opencv.cpp +++ b/src/examples/Example_opencv.cpp @@ -42,16 +42,6 @@ using namespace openshot; using namespace cv; -cv::Mat qimage2mat( std::shared_ptr& qimage) { - - cv::Mat mat = cv::Mat(qimage->height(), qimage->width(), CV_8UC4, (uchar*)qimage->bits(), qimage->bytesPerLine()); - cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); - int from_to[] = { 0,0, 1,1, 2,2 }; - cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 ); - return mat2.clone(); -}; - - int main(int argc, char* argv[]) { openshot::Settings *s = openshot::Settings::Instance(); @@ -95,17 +85,13 @@ int main(int argc, char* argv[]) { //int frame_number = (rand() % 750) + 1; int frame_number = frame; std::shared_ptr f = r9.GetFrame(frame_number); - - std::shared_ptr qimage = f->GetImage(); - // qimage->convertToFormat(QImage::Format_RGB888); // convert to opencv image - cv::Mat cvimage = qimage2mat(qimage); + cv::Mat cvimage = f->GetImageCV(); cvtColor(cvimage, cvimage, CV_RGB2BGR); if(!trackerInit){ - // Rect2d bbox(287, 23, 86, 320); Rect2d bbox = selectROI("Display Image", cvimage); kcfTracker.initTracker(bbox, cvimage); @@ -113,18 +99,9 @@ int main(int argc, char* argv[]) { } else{ trackerInit = kcfTracker.trackFrame(cvimage); - - } - - - // opencv code - if ( !cvimage.data ) - { - std::cout << "No image data \n"; } cv::imshow("Display Image", cvimage); - cv::waitKey(30);