我在使用openCV初始化3D Mat时遇到问题。 我想创建一个大小为(矩阵x cols x 16)的3D矩阵,行和列是程序中先前给出的图像的尺寸。我尝试过我不能说有多少种不同的方法,而且所有的方法都或多或少地回到我身上:我的矩阵的维度值为0或-858993460。
我的代码行:
Mat image_Conv;
int rows = imageBicubic.rows;
int cols = imageBicubic.cols;
image_Conv = Mat::zeros(rows, cols, CV_32FC(16));
你能告诉我为什么会遇到这个问题吗?当然我读了所有发言的帖子,在课堂上阅读了文档opencv,但没有任何作用,我仍然有同样的问题。我指定Mat中的数据是浮点数。
代码:
// Include standard headers
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <ctime>
#include <iostream>
using namespace std;
//#include <opencv.hpp>
#include <opencv/cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv/highgui.h>
using namespace cv;
////////////////////////////////////////
// main file
int main()
{
string fileName = "myImage.jpg";
Mat imageSrc = cv::imread(fileName, CV_LOAD_IMAGE_UNCHANGED); // Read the file
if (!imageSrc.data) // Check for invalid input
{
cout << "Could not open or find the image\n";
return 1;
}
cout << "Loaded " << fileName << " (" << imageSrc.channels() << " channels)\n";
//int colorTransform = (imageSrc.channels() == 4) ? CV_BGRA2RGBA : (imageSrc.channels() == 3) ? CV_BGR2RGB : CV_GRAY2RGB;
//cv::cvtColor(imageSrc, imageSrc, colorTransform);
imageSrc.convertTo(imageSrc, CV_32F, 1 / 255.0, 0.0);
int SliceSizeWidth = imageSrc.cols / 2;
int sliceShiftWidth = imageSrc.cols / 4;
int sliceWidthNumber = (imageSrc.cols / sliceShiftWidth) - 1;
int SliceSizeHeight = imageSrc.rows / 2;
int sliceShiftHeight = imageSrc.rows / 4;
int sliceHeightNumber = (imageSrc.rows / sliceShiftHeight) - 1;
for (int sliceIndexHeight = 0; sliceIndexHeight < sliceHeightNumber; sliceIndexHeight++)
{
for (int sliceIndexWidth = 0; sliceIndexWidth < sliceWidthNumber; sliceIndexWidth++)
{
Mat patchImage = imageSrc(Rect(sliceIndexWidth*sliceShiftWidth, sliceIndexHeight*sliceShiftHeight, SliceSizeWidth, SliceSizeHeight));
Mat patchImageCopy;
patchImage.copyTo(patchImageCopy); // Deep copy => data are contiguous in patchImageCopy
Mat imageBicubic;
resize(patchImageCopy, imageBicubic, Size(2 * patchImage.cols, 2 * patchImage.rows), INTER_CUBIC);
Mat image_Padding;
int padding = 1;
copyMakeBorder(imageBicubic, image_Padding, padding, padding, padding, padding, BORDER_CONSTANT, Scalar(0));
Mat image_Conv;
int rows = imageBicubic.rows;
int cols = imageBicubic.cols;
image_Conv = Mat::zeros(rows, cols, CV_32FC(16));
/* rest of the code I have to write */
image_Conv.convertTo(image_Conv, CV_8U, 255.0, 0.0);
string nameBase = fileName.substr(0, fileName.find('.'));
string nameExt = fileName.substr(fileName.find('.'), fileName.length() - nameBase.length());
string strH = to_string(sliceIndexHeight);
string strW = to_string(sliceIndexWidth);
string outFileName = nameBase + "_H" + strH + "W" + strW + nameExt;
imwrite(outFileName, image_Conv);
}
}
return 0;
}
PS:大部分代码都不是我的,我必须将它用于我的实习,并且只能在两行之间进行编辑:
resize(patchImageCopy, imageBicubic, Size(2 * patchImage.cols, 2 * patchImage.rows), INTER_CUBIC);
和
image_Conv.convertTo(image_Conv, CV_8U, 255.0, 0.0);
感谢您的帮助!
编辑:我的第一个问题已经解决,但似乎它毕竟不起作用。我想Mat :: zeros将所有Mat元素设置为0,对吧?但如果我写
cout << image_Conv.at<float>(0,0,0) << endl;
我有错误:&#34; xxxxxx.exe中0x000007FEFD4FA06D处的未处理异常:Microsoft C ++异常:cv ::内存位置0x000000000023E540的异常。&#34;。
我不知道内存有什么问题以及如何修复它。
我的目标是逐个填充我的矩阵元素,这要归功于几个for循环,这些循环将在我的相应Mat的元素中写入结果之前实现几个操作。我这样做是为什么3D和4D阵列,也许它是最简单的解决方案,用阵列进行所有的计算,但是我不能从3D阵列转到3D Mat或3D Mat到a 3D阵列。
答案 0 :(得分:1)
刚刚在visual studio 2015上测试了这个,opencv 3.4
cv::Mat mat = cv::Mat::zeros(5, 5, CV_32FC(16));
这很好。
答案 1 :(得分:1)
您应该能够使用以下内容创建一个填充0值的multi-dimensional matrix:
int size[3] = { 5, 4, 3 };
cv::Mat M(3, size, CV_32F, cv::Scalar(0));
您可以使用M.at(i,j,k)(仅针对上面创建的3D矩阵)迭代矩阵:
for (int i = 0; i < size[0]; i++) {
for (int j = 0; j < size[1]; j++) {
for (int k = 0; k < size[2]; k++) {
M.at<float>(i,j,k) = i*12+j*3+k;
}
}
}
for (int i = 0; i < size[0]; i++) {
for (int j = 0; j < size[1]; j++) {
for (int k = 0; k < size[2]; k++) {
std::cout << "M(" << i << ", " << j << ", " << k << "): " << M.at<float>(i,j,k) << std::endl;
}
}
}
或者,您应该能够使用以下内容创建具有多个频道的2D矩阵:
cv::Mat M(5, 4, CV_32FC(3), cv::Scalar(0));
迭代2D矩阵和通道:
for (int i = 0; i < M.rows; i++) {
for (int j = 0; j < M.cols; j++) {
for (int k = 0; k < M.channels(); k++) {
M.at<cv::Vec<float, 3> >(i,j)[k] = i*M.cols*M.channels()+j*M.channels()+k;
}
}
}