diff --git a/obj/recorder-cmd.pro b/obj/recorder-cmd.pro
index 9170ac9ad698bd7c416e2233736a580a6b7891a3..ac54cd1114cee37eb662ce53495d227cfe9c69c2 100644
--- a/obj/recorder-cmd.pro
+++ b/obj/recorder-cmd.pro
@@ -8,12 +8,14 @@ SOURCES += \
 	../src/cmd/console.cpp \
 	../src/cmd/core.cpp \
 	../src/cmd/frameObserver.cpp \
+	../src/cmd/frameProcessor.cpp \
 	../src/utils.cpp
 
 HEADERS += \
 	../src/cmd/console.h \
 	../src/cmd/core.h \
 	../src/cmd/frameObserver.h \
+	../src/cmd/frameProcessor.h \
 	../src/utils.h
 
 DEFINES *= QT_USE_QSTRINGBUILDER		#converts + to % when building strings
@@ -29,6 +31,7 @@ LIBS += -L$${VIMBA_LIB_DIR} -lVmbC -lVmbCPP -Wl,-rpath,\'\$$ORIGIN\'
 
 #-Wl,-rpath,.
 QMAKE_POST_LINK += cp $${VIMBA_LIB_DIR}/lib*.so ../bin  # copy vmb-libs to bin
+QMAKE_CXXFLAGS += -Wno-deprecated-enum-enum-conversion # ignore opencv warnings.
 
 #PRE_LINK: cp vimba libs once
 # cp ../b/vimbax/api/lib/GenICam/*.so $${VIMBA_LIB_DIR}
diff --git a/src/cmd/core.cpp b/src/cmd/core.cpp
index f8d8103187a821bfd3a0c1d8086decc8d087aa21..c75137307bb3c08c24540b4ee76dba04612ee84e 100644
--- a/src/cmd/core.cpp
+++ b/src/cmd/core.cpp
@@ -1,7 +1,7 @@
 #include "core.h"
 #include "VmbC/VmbCommonTypes.h"
 #include "VmbCPP/SharedPointerDefines.h"
-#include "frameObserver.h"
+#include "frameobserver.h"
 
 #include "../utils.h"
 #include <iostream>
@@ -203,8 +203,8 @@ void Core::record()
 	if ( f(curCam->GetFeatureByName ("PayloadSize", pFeature ),"get PayloadSize") )
 		return; // emit error("Couldn't get payload size 1");
 
-	if( pFeature == nullptr )
-		return; // emit error("Couldn't get payload size 2");
+	// if( pFeature == nullptr )
+		// return; // emit error("Couldn't get payload size 2");
 
 	if( f(pFeature->GetValue (nPLS)))
 		return;
diff --git a/src/cmd/frameObserver.cpp b/src/cmd/frameObserver.cpp
deleted file mode 100644
index f0796be944d60e33a0eb59e55aff63ea0731df2d..0000000000000000000000000000000000000000
--- a/src/cmd/frameObserver.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "frameObserver.h"
-
-#include <VmbCPP/SharedPointerDefines.h>
-#include <VmbCPP/Camera.h>
-#include <QDebug>
-
-using namespace VmbCPP;
-
-
-FrameObserver::FrameObserver( CameraPtr pCamera ) : IFrameObserver( pCamera )
-{
-	// static int count=0;
-	// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << " #:" << count++
-}
-
-// Frame callback notifies about incoming frames
-void FrameObserver::FrameReceived ( const FramePtr pframe )
-{
-	VmbUint64_t timestamp;
-	qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
-	pframe->GetTimestamp(timestamp);
-	qDebug() << "FrameObserver::FrameReceived():" << timestamp;
-
-	// process data afap
-	// some functions are prohibited within this callback
-
-	// XXX
-	// ensure framedata is valid:
-	// Frame::GetReceiveStatus == VmbFrameStatusComplete
-	// pframe->GetReceiveStatus(VmbFrameStatusType &status)
-
-	// Send notification to working thread
-	// Do not apply image processing within this callback ( performance )
-	// When the frame has been processed , requeue it
-
-	m_pCamera->QueueFrame( pframe );
-}
diff --git a/src/cmd/frameObserver.h b/src/cmd/frameObserver.h
deleted file mode 100644
index 8eb7b222557db32481724c45dfad662805ed21ac..0000000000000000000000000000000000000000
--- a/src/cmd/frameObserver.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#include <VmbCPP/IFrameObserver.h>
-
-namespace VmbCPP{
-
-class FrameObserver : public IFrameObserver
-{
-	public:
-		void FrameReceived( const FramePtr pFrame );
-		FrameObserver( CameraPtr pCamera );
-};
-
-}
diff --git a/src/cmd/frameobserver.cpp b/src/cmd/frameobserver.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..28feedb6b9534946a9b196b226f6dd1bfa26dd7f
--- /dev/null
+++ b/src/cmd/frameobserver.cpp
@@ -0,0 +1,53 @@
+#include "frameobserver.h"
+#include "frameprocessor.h"
+#include "qnamespace.h"
+
+#include <VmbCPP/SharedPointerDefines.h>
+#include <VmbCPP/Camera.h>
+
+#include <QDebug>
+#include <QThread>
+#include <QObject>
+
+
+using namespace VmbCPP;
+
+
+FrameObserver::FrameObserver( CameraPtr pCamera ) : IFrameObserver( pCamera )
+{
+	// static int count=0;
+	// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << " #:" << count++
+}
+
+// Frame callback notifies about incoming frames
+// process data afap
+// some functions are prohibited within this callback!
+// Do not apply image processing within this callback ( performance )
+// -> create frame processor to handle frame processing asynchronously
+// When the frame has been processed , requeue it
+void FrameObserver::FrameReceived ( const FramePtr pframe )
+{
+	qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
+
+	FrameProcessor *processor = new FrameProcessor(pframe, this);
+
+
+	QThread *thread = new QThread;
+	processor->moveToThread(thread);
+
+	connect(thread, &QThread::started, processor, &FrameProcessor::processFrame);
+	connect(processor, &FrameProcessor::frameProcessed, processor, &FrameProcessor::deleteLater);
+	connect(processor, &FrameProcessor::frameProcessed, thread, &QThread::quit);
+	connect(processor, &FrameProcessor::frameProcessed, this, &FrameObserver::queueFrame); // Connect to a slot in FrameObserver
+	connect(thread, &QThread::finished, thread, &QThread::deleteLater);
+
+	thread->start();
+
+	m_pCamera->QueueFrame( pframe );
+}
+
+
+void FrameObserver::queueFrame(FramePtr pFrame)
+{
+	m_pCamera->QueueFrame(pFrame); // Queue the frame back to the camera
+}
diff --git a/src/cmd/frameobserver.h b/src/cmd/frameobserver.h
new file mode 100644
index 0000000000000000000000000000000000000000..23f39ce1ea739e6940df9b17cac304fdf9caab9d
--- /dev/null
+++ b/src/cmd/frameobserver.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <QObject>
+#include <VmbCPP/IFrameObserver.h>
+
+// using VmbCPP::CameraPtr;
+// using VmbCPP::FramePtr;
+// using VmbCPP::IFrameObserver;
+using namespace VmbCPP;
+
+class FrameObserver : public QObject, public IFrameObserver
+{
+	Q_OBJECT
+
+	public:
+		void FrameReceived( const FramePtr pFrame );
+		FrameObserver( CameraPtr pCamera );
+
+	private slots:
+		void queueFrame(FramePtr pFrame);
+
+};
+
diff --git a/src/cmd/frameprocessor.cpp b/src/cmd/frameprocessor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cd6cbca3e5ba2cf8356171c5b91dbd8526af4862
--- /dev/null
+++ b/src/cmd/frameprocessor.cpp
@@ -0,0 +1,66 @@
+#include "frameprocessor.h"
+#include "opencv2/imgcodecs.hpp"
+
+#include <opencv2/opencv.hpp>
+
+#include <VmbC/VmbCommonTypes.h>
+#include <VmbCPP/Frame.h>
+
+#include <QDebug>
+#include <QThread>
+#include <QObject>
+#include <QImage>
+
+FrameProcessor::FrameProcessor(FramePtr pframe, QObject *parent) : QObject(parent), m_pframe(pframe)
+{}
+
+//2d check image format!
+//2d add camera name to filename
+/// Process the received frame asynchronously
+void FrameProcessor::processFrame()
+{
+	// process frames receiveStatus
+	VmbFrameStatusType status;
+	m_pframe->GetReceiveStatus(status);
+	if (status != VmbFrameStatusComplete)
+	{
+		qDebug() << "Frame not complete, skip processing.";
+		return;
+	}
+
+	VmbUint32_t width = 0;
+	VmbUint32_t height = 0;
+	unsigned char* pdata;
+	VmbPixelFormatType pixelFormat;
+	VmbUint64_t timestamp;
+
+	m_pframe->GetWidth(width);
+	m_pframe->GetHeight(height);
+	m_pframe->GetBuffer(pdata);
+	m_pframe->GetPixelFormat(pixelFormat);
+	m_pframe->GetTimestamp(timestamp);
+
+	cv::Mat frameMat(height, width, CV_8UC3, pdata);
+
+	if (pixelFormat == VmbPixelFormatRgb8)
+	{
+		// If the frame pixel format is RGB8, directly copy the data
+		// memcpy(frameMat.data, pData, width * height * 3);
+		qDebug() << "Pixel format is RGB8";
+	}
+	else
+	{
+		// If the pixel format is not already in BGR format, you may need to convert it
+		// cv::Mat tempMat(height, width, CV_8UC1, pdata); //UC1??
+		// cv::cvtColor(tempMat, frameMat, cv::COLOR_BayerGB2BGR); // Adjust the conversion based on the actual Bayer pattern
+		qDebug() << "Pixel format is not RGB8, converting to BGR";
+	}
+
+	std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 99, cv::IMWRITE_JPEG_OPTIMIZE, 1, cv::IMWRITE_JPEG_RST_INTERVAL,4};
+
+	QString filename = QString::number(timestamp) + "frame.jpg";
+	cv::imwrite(filename.toStdString(), frameMat, params);
+	qDebug() << "Frame saved as JPEG: " << filename;
+
+	emit frameProcessed(m_pframe);
+}
diff --git a/src/cmd/frameprocessor.h b/src/cmd/frameprocessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..9a803355af44b506ce5d2865f509aaff73090a0d
--- /dev/null
+++ b/src/cmd/frameprocessor.h
@@ -0,0 +1,21 @@
+#include <QObject>
+#include <VmbCPP/SharedPointerDefines.h>
+
+using VmbCPP::FramePtr;
+
+class FrameProcessor : public QObject
+{
+	Q_OBJECT
+
+public:
+	explicit FrameProcessor(FramePtr, QObject *parent = nullptr);
+
+public slots:
+	void processFrame();
+
+signals:
+	void frameProcessed(FramePtr);
+
+private:
+	FramePtr m_pframe;
+};