- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我必须使用 MS DirectShow 从相机捕捉视频帧(我只想要原始像素数据)。
我能够构建图形/过滤器网络(捕获设备过滤器和 ISampleGrabber)并实现回调(ISampleGrabberCB)。我收到大小合适的 sample 。
但是,它们总是上下颠倒(垂直翻转,即不旋转)并且颜色 channel 是 BGR 顺序(不是 RGB)。
我尝试将 BITMAPINFOHEADER 中的 biHeight 字段设置为正值和负值,但没有任何效果。根据 MSDN 文档,ISampleGrapper::SetMediaType() 无论如何都会忽略视频数据的格式 block 。
这是我看到的(用不同的相机记录的,不是 DS),以及 DirectShow ISampleGrabber 给我的:“RGB”实际上分别是红色、绿色和蓝色:
我正在使用的代码示例,略有简化:
// Setting the media type...
AM_MEDIA_TYPE* media_type = 0 ;
this->ds.device_streamconfig->GetFormat(&media_type); // The IAMStreamConfig of the capture device
// Find the BMI header in the media type struct
BITMAPINFOHEADER* bmi_header;
if (media_type->formattype != FORMAT_VideoInfo) {
bmi_header = &((VIDEOINFOHEADER*)media_type->pbFormat)->bmiHeader;
} else if (media_type->formattype != FORMAT_VideoInfo2) {
bmi_header = &((VIDEOINFOHEADER2*)media_type->pbFormat)->bmiHeader;
} else {
return false;
}
// Apply changes
media_type->subtype = MEDIASUBTYPE_RGB24;
bmi_header->biWidth = width;
bmi_header->biHeight = height;
// Set format to video device
this->ds.device_streamconfig->SetFormat(media_type);
// Set format for sample grabber
// bmi_header->biHeight = -(height); // tried this for either and both interfaces, no effect
this->ds.sample_grabber->SetMediaType(media_type);
// Connect filter pins
IPin* out_pin= getFilterPin(this->ds.device_filter, OUT, 0); // IBaseFilter interface for the capture device
IPin* in_pin = getFilterPin(this->ds.sample_grabber_filter, IN, 0); // IBaseFilter interface for the sample grabber filter
out_pin->Connect(in_pin, media_type);
// Start capturing by callback
this->ds.sample_grabber->SetBufferSamples(false);
this->ds.sample_grabber->SetOneShot(false);
this->ds.sample_grabber->SetCallback(this, 1);
// start recording
this->ds.media_control->Run(); // IMediaControl interface
我正在检查每个函数的返回类型,没有发现任何错误。
感谢任何提示或想法。
我已经尝试过的事情:
将捕获设备过滤器或样本采集器的 biHeight 字段设置为负值,或两者均设置为负值 - 没有任何效果。
使用 IGraphBuilder 连接引脚 - 同样的问题。
在更改媒体类型之前连接引脚 - 同样的问题。
通过再次查询来检查过滤器是否实际应用了媒体类型 - 但它显然已应用或至少已存储。
将图像解释为总字节反转(最后一个字节在前,第一个字节在后)- 然后它将水平翻转。
检查是否是摄像机的问题 - 当我使用 VLC(DirectShow 捕获)对其进行测试时,它看起来很正常。
最佳答案
我注意到当使用 I420 色彩空间时,旋转消失了。此外,大多数当前的编解码器 (VP8) 都使用 I420 颜色空间作为原始 I/O 格式。
我在I420颜色空间写了一个简单的镜像框函数。
void Camera::OutputCallback(unsigned char* data, int len, uint32_t timestamp, void *instance_)
{
Camera *instance = reinterpret_cast<Camera*>(instance_);
Transport::RTPPacket packet;
packet.rtpHeader.ts = timestamp;
packet.payload = data;
packet.payloadSize = len;
if (instance->mirror)
{
Video::ResolutionValues rv = Video::GetValues(instance->resolution);
int k = 0;
// Chroma values
for (int i = 0; i != rv.height; ++i)
{
for (int j = rv.width; j != 0; --j)
{
int l = ((rv.width * i) + j);
instance->buffer[k++] = data[l];
}
}
// U values
for (int i = 0; i != rv.height/2; ++i)
{
for (int j = (rv.width/2); j != 0; --j)
{
int l = (((rv.width / 2) * i) + j) + rv.height*rv.width;
instance->buffer[k++] = data[l];
}
}
// V values
for (int i = 0; i != rv.height / 2; ++i)
{
for (int j = (rv.width / 2); j != 0; --j)
{
int l = (((rv.width / 2) * i) + j) + rv.height*rv.width + (rv.width/2)*(rv.height/2);
if (l == len)
{
instance->buffer[k++] = 0;
}
else
{
instance->buffer[k++] = data[l];
}
}
}
packet.payload = instance->buffer;
}
instance->receiver->Send(packet);
}
关于c++ - 直接显示 ISampleGrabber : samples are upside-down and color channels reverse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17060341/
嗯,这是一个非常有趣的问题。我已经布置了一个 NSTableView (基于 View ),它连接到从 Nib 加载的自定义单元格(在 -initWithCoder: 中),但单元格本身呈现颠倒。但这
我正在开发一个程序来调整 BMP 文件的大小并将其存储在一个新文件中。我注意到有些 BMP 完全颠倒存储,而其他 BMP 则只是直立存储。所以我做了两个解决方案来处理这两种情况。我的问题是如何事先知道
我正在尝试找出确定是否将 donut 标签上的文本旋转 180 度所需的逻辑。基本上,如果它们上下颠倒,我想将它们旋转 180 度以提高可读性。理想情况下,这仅适用于颠倒的文本标签,而不适用于已经可读
我有一个有序图像序列,我用 cv2.videocapture 将它读作视频,称之为 train_video。但是我注意到视频与原始图像序列相比是颠倒的,因此我想使用 cv2.flip 函数来翻转它。
我正在学习seaborn,并且遇到了一些意想不到的行为。 这个可重现的示例使用了 Surveys.csv 数据集,可以在此链接中找到:http://www.datacarpentry.org/pyth
我有一个容器的 CSS 样式 ...我添加了 display: flex;将柱子放入容器中并像这样适应它们的宽度 .pillars { display: flex; background-co
我尝试了 watermark existing pdf with ruby 中的示例,但是当我打印生成的文档时,“WATERMARK”被倒过来打印,几乎就像它到达了纸张的末端,折叠起来然后打印在背面(
我必须使用 MS DirectShow 从相机捕捉视频帧(我只想要原始像素数据)。 我能够构建图形/过滤器网络(捕获设备过滤器和 ISampleGrabber)并实现回调(ISampleGrabber
我有一个支持所有四个方向的应用程序,在 上运行良好iOS 5 . 然而,在 iOS 6 ,我所有的 UIViewController 类旋转正常,但我的 UITableViewController 类
我已经找到了解决方案。但是,我找不到任何解决问题的方法。 问题: 我想在 NSTextField 中自定义占位符文本,但它会显示颠倒。 let string = "Enter \"Script\" H
我们制作了一个程序,它将一长串以制表符分隔的输入粘贴到控制台窗口中,并将其拆分为正确的变量。然而,最近有一些长串的元数据,出现了一堆倒置的问号 - 有时在粘贴后,有时在粘贴之前,有时两者都有.....
任何人都知道如何为 iOS 8 设备修复此问题。是 Apple 的 UIAlertview 实现问题吗? 我有相同的屏幕截图。但由于信誉限制无法上传:( 最佳答案 在 IOS8 中添加了 UIAler
我是一名优秀的程序员,十分优秀!