opencv由二维数组转换图像问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv由二维数组转换图像问题相关的知识,希望对你有一定的参考价值。
Mat image; image.create(m ,n ,CV_8UC3); for(int j = 0; j < m; ++j) uchar* data = image.ptr(j); for(int i = 0; i < n; ++i) *data++ = p[m][i++]; *data++ = p[m][i++]; *data++ = p[m][i++]; // IplImage pImg= IplImage(m); IplImage * img = cvCreateImage(cvGetSize(&image),IPL_DEPTH_8U,3); cvGetImage(&image,img); cvNamedWindow("1"); cvShowImage("1",img); cvWaitKey(4000); //cvReleaseImage(&&pImg); cvDestroyAllWindows(); //释放内存 for (i=0; i<m; i++) delete [] p[i]; delete [] p;为什么会出错呢?我的二维数组是p数组,我是新手,求指导!!
我现在问题是报错但不知道怎么处理,我想要由数组p显示图像,可是显示不了,求指教!问题代码如下:
CvMat mat = cvMat(width,height,CV_8UC3,p);
IplImage * img = cvCreateImage(cvGetSize(&mat),IPL_DEPTH_8U,1);
cvGetImage(&mat,img);
cvNamedWindow("1");
cvShowImage("1",img);
cvWaitKey(0);
2、然后将二维数组中每个像素值,赋给变量,最后直接cvSaveImage保存图像。
3、最后cvRealease释放空间。 参考技术B 第一OpenCV中的Mat矩阵就是你想要的二维数组值,你可以建立一个动态二维数组传出Mat矩阵存储图像的值!至于你说的存储数组值显示成图像而不是数据,你可以将使用数据类型转换!因为OpenCV的cvShowImage()你需要查下支持什么数据类型显示!例如:字符型变换成IplImage型等本回答被提问者和网友采纳 参考技术C 首先你需要声明一个OpenCV的IplImage * 格式的变量并使用cvCreateImage申请空间,用于存储图像。
然后将二维数组中每个像素值,赋给变量,最后直接cvSaveImage保存图像。
最后cvRealease 释放空间
在 OpenCV 中创建二维矩阵数组?
【中文标题】在 OpenCV 中创建二维矩阵数组?【英文标题】:Creating a 2D array of matrices in OpenCV? 【发布时间】:2018-04-12 21:20:37 【问题描述】:我正在尝试从头开始实施 SIFT 算法。现在,我正在尝试生成比例空间,其中包含多个比例减小的模糊图像。我的直觉是使用数组,因为我知道我需要的维度并且它们不会改变。在 2D 数组中,每个元素都是表示模糊图像的矩阵。每列将代表一个八度。但是,无论是 OpenCV(2.4 版)还是 g++ 似乎都不明白我想要什么。我正在使用头文件和实现文件,但是,SIFT 算法不适合对象(IMO),所以我避免使用它们。 这是我的头文件代码:
#include <opencv2/opencv.hpp>
void generateOctaves(cv::Mat img); // Function to generate octaves.
void approxLoG(cv::Mat passOctave[4][5]); // Function to approximate Laplacian of Gaussian
下面是对应实现文件的代码:
#include <iostream>
#include <cmath>
#include <opencv2/opencv.hpp>
#include "scaleSpace.h"
// Generate four octaves with five images each.
using namespace std;
using namespace cv;
void generateOcatves(Mat img) // Determine Octaves
Mat octaves[4][5]; // Creates 4x5 array/grid to hold 4 octaves, each comprised of 5 images.
Mat resizedImg; // Holds resized image.
resize(img, resizedImg, Size(), 2, 2, CV_INTER_CUBIC); // Double image size to allow for more keypoints
Mat originalResize = resizedImg; // Temp matrix to hold the original resized image prior to blurring.
double sigma = 1.6; // General value for sigma
double k = sqrt(2); // Gneral value for k
for(int i=0; i < 4; i++)
if(i > 0) // Shrink image on all iterations other than the first.
resize(originalResize, resizedImg, Size(), 0.5, 0.5, CV_INTER_AREA);
// Reset altered values.
originalResize = resizedImg;
sigma = 1.6;
for(int j=0; j < 5; j++)
octaves[i][j] = resizedImg;
GaussianBlur(resizedImg, resizedImg, Size(0,0), sigma, sigma, 0); // Perform Gaussian Blur on the image.
sigma = sigma * k;
imshow("Octave", resizedImg);
cout << "Press Enter to continue." << endl;
while (true)
char cont=(char)waitKey(25);
if(cont == 27)
destroyAllWindows();
break;
approxLoG(octaves[4][5]);
void approxLoG(Mat passOctave[4][5])
// Compute the DoG of consecutive scales. Computing the DoG gives an approximation of the LoG in less time.
// Since the LoG would have to be computed for multiple images, the DoG is used.
Mat array_DoG[4][4]; // 4x4 array to hold four octaves and 4 DoG images. There is one less DoG created than images in each octave for each octave.
for(int i=0; i < 4; i++)
for(int j=0; j < 4; j++)
Mat DoG = passOctave[i][j] - passOctave[i][j+1]; // Compute DoG
imshow("Difference of Gaussian", DoG);
array_DoG[i][j] = DoG;
char cont=(char)waitKey(25);
if(cont == 27)
destroyAllWindows();
我得到的编译错误是:
g++ -g -c scaleSpace.cpp `pkg-config --cflags --libs opencv2`
scaleSpace.cpp: In function ‘void generateOcatves(cv::Mat)’:
scaleSpace.cpp:50:26: error: cannot convert ‘cv::Mat’ to ‘cv::Mat (*)[5]’ for argument ‘1’ to ‘void approxLoG(cv::Mat (*)[5])’
approxLoG(octaves[4][5]);
让我特别困惑的是,可以使用 OpenCV 创建一维矩阵数组,如 here 所示。 我可能可以使用二维向量而不是数组。但是,即便如此,为什么二维数组不起作用,而一维数组却可以呢?
【问题讨论】:
【参考方案1】:您的线路:
approxLoG(octaves[4][5]);
octaves[4][5]
就像其他每个 octaves[i][j]
正在访问单个元素一样。这个越界了。
要传递数组,只需编写:
approxLoG(octaves);
【讨论】:
我仍然对八度音阶越界感到困惑。八度音阶的每个元素不是矩阵吗?我查看了我的 for 循环逻辑,它似乎在我的适当范围内。你能详细说明一下吗? @SaulKapruac 记住索引在 0 到 size-1 之间,大小是禁止的。 0, 1, 2, 3 用于i
,0, 1, 2, 3, 4 用于j
。 octaves[i=4][j=5]
等更高的值超出范围。
是的,但我的条件是 i 和 j 分别小于 4 和 5。因此,当达到这些数字并且不再满足小于条件时,for 循环将停止迭代。
@SaulKapruac 我说的是你的电话:approxLoG(octaves[4][5]);
。你的 for 循环很好。以上是关于opencv由二维数组转换图像问题的主要内容,如果未能解决你的问题,请参考以下文章