cv::imshow可以通过new的方式创建吗
时间: 2023-09-08 10:10:51 浏览: 80
`cv::imshow`是OpenCV库提供的一个函数,用于在窗口中显示图像。它是一个函数而不是一个类,因此不能通过`new`运算符来创建。
如果您想在动态内存中创建一个窗口并显示图像,可以考虑使用Qt库中提供的`QLabel`和`QPixmap`来实现,代码示例如下:
```c++
cv::Mat image = cv::imread("example.jpg"); // 读入图像
if (image.empty()) {
// 图像读取失败
return;
}
// 将图像数据转换为QImage
QImage qimage(image.data, image.cols, image.rows, QImage::Format_RGB888);
// 创建QPixmap并在其中显示图像
QPixmap pixmap = QPixmap::fromImage(qimage);
QLabel label;
label.setPixmap(pixmap);
label.show();
```
这样可以在Qt应用程序中创建一个窗口并显示图像。
相关问题
cv::imshow如何整合到QT控件中
要将cv::imshow()整合到QT控件中,可以使用Qt的QLabel控件。
首先,需要将cv::Mat转换为QImage,然后将QImage设置为QLabel的图像。
以下是一个示例代码,演示了如何将cv::Mat转换为QImage并将其设置为QLabel的图像:
```c++
#include <opencv2/opencv.hpp>
#include <QLabel>
#include <QImage>
#include <QPixmap>
// 将cv::Mat转换为QImage
QImage cvMatToQImage(const cv::Mat& mat) {
QImage image(mat.cols, mat.rows, QImage::Format_RGB888);
for (int y = 0; y < mat.rows; ++y) {
const uchar* row = mat.ptr<uchar>(y);
for (int x = 0; x < mat.cols; ++x) {
QRgb color = qRgb(row[x * 3], row[x * 3 + 1], row[x * 3 + 2]);
image.setPixel(x, y, color);
}
}
return image;
}
// 显示cv::Mat
void showCvMat(cv::Mat mat, QLabel* label) {
QImage image = cvMatToQImage(mat);
QPixmap pixmap = QPixmap::fromImage(image);
label->setPixmap(pixmap);
}
int main() {
cv::Mat mat = cv::imread("test.jpg");
// 创建QLabel
QLabel* label = new QLabel();
// 显示cv::Mat
showCvMat(mat, label);
// 将QLabel添加到布局中
// ...
return 0;
}
```
需要注意的是,在将cv::Mat转换为QImage时,需要注意它们的数据格式,例如RGB或BGR。此外,由于OpenCV中的图像数据是连续的,因此可以在转换时使用CV_8UC3类型。
用c语言改写import cv2 import numpy as np #读取原始图像 img = cv2.imread('scenery.png', 1) #获取图像的高度和宽度 height, width = img.shape[:2] #图像灰度处理 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #创建目标图像 dstImg = np.zeros((height,width,1),np.uint8) #浮雕特效算法:newPixel = grayCurrentPixel - grayNextPixel + 150 for i in range(0,height): for j in range(0,width-1): grayCurrentPixel = int(gray[i,j]) grayNextPixel = int(gray[i,j+1]) newPixel = grayCurrentPixel - grayNextPixel + 150 if newPixel > 255: newPixel = 255 if newPixel < 0: newPixel = 0 dstImg[i,j] = newPixel #显示图像 cv2.imshow('src', img) cv2.imshow('dst',dstImg) #等待显示 cv2.waitKey() cv2.destroyAllWindows()
以下是使用C语言改写后的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
//读取原始图像
Mat img = imread("scenery.png", IMREAD_COLOR);
if (img.empty())
{
printf("Could not read the image: %s\n", argv[1]);
return -1;
}
//获取图像的高度和宽度
int height = img.rows;
int width = img.cols;
//图像灰度处理
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
//创建目标图像
Mat dstImg(height, width, CV_8UC1);
//浮雕特效算法:newPixel = grayCurrentPixel - grayNextPixel + 150
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width - 1; j++)
{
int grayCurrentPixel = (int)gray.at<uchar>(i, j);
int grayNextPixel = (int)gray.at<uchar>(i, j + 1);
int newPixel = grayCurrentPixel - grayNextPixel + 150;
if (newPixel > 255)
{
newPixel = 255;
}
if (newPixel < 0)
{
newPixel = 0;
}
dstImg.at<uchar>(i, j) = (uchar)newPixel;
}
}
//显示图像
namedWindow("src", WINDOW_AUTOSIZE);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("src", img);
imshow("dst", dstImg);
//等待显示
waitKey(0);
destroyAllWindows();
return 0;
}
```
注意:在使用该代码之前,需要先安装OpenCV库,并确保编译器能够正确链接该库。
阅读全文