diff --git a/include/Frame.h b/include/Frame.h
index f4ff54d4..9d2e881b 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 764b9651..2fb6d48d 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 69b44d03..daec0053 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);