捕获图像而不保存
Capture image without saving
基于这个线程,是否有一种方法来处理图像从相机在QML不保存它?
从文档的例子开始,capture()函数将图像保存到Pictures位置。我想要实现的是使用onImageCaptured每秒处理相机图像,但我不想将其保存到驱动器。
我已经尝试使用onimagessaved信号实现清理操作,但它也影响onImageCaptured
您可以通过mediaObject
连接c++和QML。这可以通过objectName
(如链接的答案)或使用专用的Q_PROPERTY
(稍后会详细介绍)来完成。在任何一种情况下,您都应该以这样的代码结束:
QObject * source // QML camera pointer obtained as described above
QObject * cameraRef = qvariant_cast<QMediaObject*>(source->property("mediaObject"));
一旦你得到了相机的钩子,使用它作为QVideoProbe
对象的源,即
QVideoProbe *probe = new QVideoProbe;
probe->setSource(cameraRef);
将videoFrameProbed
信号连接到合适的槽位,即
connect(probe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(processFrame(QVideoFrame)));
,就是这样:你现在可以在processFrame
函数中处理你的帧。这样一个函数的实现如下所示:
void YourClass::processFrame(QVideoFrame frame)
{
QVideoFrame cFrame(frame);
cFrame.map(QAbstractVideoBuffer::ReadOnly);
int w {cFrame.width()};
int h {cFrame.height()};
QImage::Format f;
if((f = QVideoFrame::imageFormatFromPixelFormat(cFrame.pixelFormat())) == QImage::Format_Invalid)
{
QImage image(cFrame.size(), QImage::Format_ARGB32);
// NV21toARGB32 convertion!!
//
// DECODING HAPPENS HERE on "image"
}
else
{
QImage image(cFrame.bits(), w, h, f);
//
// DECODING HAPPENS HERE on "image"
}
cFrame.unmap();
}
这里有两个重要的实现细节:
- Android设备使用YUV格式,目前
QImage
不支持,应该手工转换。我在这里做了一个强有力的假设,即所有无效格式都是YUV。在当前的操作系统上,通过ifdef
的条件可以更好地管理。 - 解码可能相当昂贵,所以你可以跳过帧(只需在此方法中添加计数器)或将工作卸载到专用线程。这也取决于制定框架的速度。同时减少它们的大小,例如只占用
QImage
的一部分,可以大大提高性能。
对于这个问题,我将完全避免
objectName
方法来获取mediaObject
,相反,我将注册一个新的类型,以便可以使用Q_PROPERTY
方法。我在想类似这样的事情:
class FrameAnalyzer
{
Q_OBJECT
Q_PROPERTY(QObject* source READ source WRITE setSource)
QObject *m_source; // added for the sake of READ function
QVideoProbe probe;
// ...
public slots:
void processFrame(QVideoFrame frame);
}
其中setSource
只是:
bool FrameAnalyzer::setSource(QObject *source)
{
m_source = source;
return probe.setSource(qvariant_cast<QMediaObject*>(source->property("mediaObject")));
}
一旦照常注册,即
qmlRegisterType<FrameAnalyzer>("FrameAnalyzer", 1, 0, "FrameAnalyzer");
可以在QML中直接设置source
属性,如下所示:
// other imports
import FrameAnalyzer 1.0
Item {
Camera {
id: camera
// camera stuff here
Component.onCompleted: analyzer.source = camera
}
FrameAnalyzer {
id: analyzer
}
}
这种方法的一大优点是可读性和Camera
代码与处理代码之间更好的耦合。这是以(稍微)更高的实现工作为代价的。
相关文章:
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- OpenCV imwrite不会保存图像
- qpixmap qclipboard和保存图像倒置
- 如何从 GIFLIB 保存图像结构中获取 RGB 颜色数据
- 处理openCV后,保存图像要文件
- Haar检测-保存图像的Mat,以便获得并显示前一帧
- 在opencv中使用imwrite保存图像时,会将图像全部写入黑色,但imshow会正确显示
- CImg保存图像会更改值
- 通过WiFi从Android向Windows发送/保存图像时数据过多
- 使用 libpng - const 对象保存图像
- 无法使用OpenCV保存图像
- 如何在c中使用socket编程保存图像数据
- 通用Windows可以动态地绘制图形和保存图像
- 模糊保存图像检测对象使用OpenCV
- Qt抓取小部件和保存图像
- 如何在英特尔RealSense(Visual c++)中保存图像
- 如何从RGBA格式保存图像的缓冲区中创建opencv中的图像
- 如何使用libcurl保存图像
- 需要一些手来渲染、显示和保存图像
- 如何通过http下载和保存图像