C++ 如何使用Visual studio将OpenCV图像查看窗口推送到QT GUI中?
我想创建一个GUI,其中有两个矩形用于查看视频(一个用于查看输入视频,另一个用于查看后处理视频) 我希望将其集成到QT制作的GUI中,但我希望这些视频区域是从OpenCV填充的,作为OpenCV的C++ 如何使用Visual studio将OpenCV图像查看窗口推送到QT GUI中?,c++,visual-studio-2010,qt,opencv,C++,Visual Studio 2010,Qt,Opencv,我想创建一个GUI,其中有两个矩形用于查看视频(一个用于查看输入视频,另一个用于查看后处理视频) 我希望将其集成到QT制作的GUI中,但我希望这些视频区域是从OpenCV填充的,作为OpenCV的cv::nameWindow方法的替代方法 我如何才能做到这一点?实现您的愿望的基本工作流程是: 使用OpenCV API打开视频(例如,cvCreateFileCapture) 从视频抓取IplImage帧(cvQueryFrame) 将其转换为QImage(见下面的附加代码) 在QLabel(QLa
cv::nameWindow
方法的替代方法
我如何才能做到这一点?实现您的愿望的基本工作流程是:
QImage*IplImage到QImage(IplImage*input)
{
如果(!输入)
返回0;
QImage图像(输入->宽度,输入->高度,QImage::格式_RGB32);
uchar*pBits=image.bits();
int nBytesPerLine=image.bytesPerLine();
对于(int n=0;nheight;n++)
{
对于(int m=0;mwidth;m++)
{
CVS标量=cvGet2D(输入,n,m);
QRgb值=QRgb((uchar)s.val[2],(uchar)s.val[1],(uchar)s.val[0]);
uchar*扫描线=pBits+n*nBytesPerLine;
((uint*)扫描线)[m]=数值;
}
}
返回图像;
}
对上述代码的理解应该是直截了当的。如果有任何疑问,请告诉我们
此“低级别”选项允许您在显示每个帧之前对其进行操作。如果您只想通过Qt显示视频,可以使用。以下是将cv::Mat转换为QImage的代码。方法分别用于24位RGB或灰度浮点
QImage Mat2QImage(const cv::Mat3b &src) {
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const cv::Vec3b *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
}
}
return dest;
}
QImage Mat2QImage(const cv::Mat_<double> &src)
{
double scale = 255.0;
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const double *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
unsigned int color = srcrow[x] * scale;
destrow[x] = qRgba(color, color, color, 255);
}
}
return dest;
}
QImage Mat2QImage(常量cv::Mat3b和src){
QImage dest(src.cols、src.rows、QImage::Format_ARGB32);
对于(int y=0;y
然后,您可以在Qt小部件中使用QImage。查看博尔赫斯的答案。我不知道如何在Qt中集成
opencv
的窗口,但是如果你在任何阶段都获得IplImage
,它可以很容易地转换为QImage
和QPixMap
,可以在QLabel
上显示为Lol4t0,我不知道如何在一些QWidget中集成opencv的视频。但我可以回答如何轻松地手动执行此操作。这真的很简单。@borges那么请回答:)回答得好!但是,他要求C++,你使用OpenCV的C API。另外,我认为如果你想检查图像中的每个像素,cvGet2D并不是很有效!如果您将RGB888用于Qimage,则可以直接使用输入图像。或者使用cvtColor()转换为BGRA以获得更好的qimage性能问题是,它比使用cvShowImage(在其自己的窗口中)慢得多。是否有社区在Qt和OpenCV的集成方面更有效??或者就是这样(我指的是你的代码)?!我也是新来的,我现在的兴趣是这个。谢谢现在,highgui模块可以选择使用Qt支持构建(imshow将为您提供一个漂亮的Qt窗口,带有缩放/平移、保存到文件等按钮)。它起源于谷歌代码夏令营项目。因此OpenCV本身现在在highgui模块中具有集成它们的功能。据我所知,它不是通过API公开的。我不知道他们是否有这样的计划。不过,这很有道理。
QImage Mat2QImage(const cv::Mat3b &src) {
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const cv::Vec3b *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
}
}
return dest;
}
QImage Mat2QImage(const cv::Mat_<double> &src)
{
double scale = 255.0;
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const double *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
unsigned int color = srcrow[x] * scale;
destrow[x] = qRgba(color, color, color, 255);
}
}
return dest;
}