Hi I had some legacy code in OpenCV C API that I want to port to C++.
In the code I have some wavelet coefficients computed into a vector: vector<vector<double>> detail
This is done without OpenCv but I late ron want to use OpenCV to display and process results further.
I there store the vector detail
into C API opencv Image dvImg = cvCreateImage( imgSz, 16, 1 );
and I do this using widthStep:
((ushort*)(dvImg->imageData + dvImg->widthStep*i))[j] = (short) (detail[i][j]);
Specifically it is a for loop that looks like this:
int J = 6; //number of detail coefficients on the image
vector<vector<double>> detail(1*rowW, vector<double>(J * colW)); //detail coefficients
cv::Size imgSz; // size of output image
//the output dimensions I wish to store detail coefficients to.
imgSz.width = J*colW;
imgSz.height = 1*rowW;
//the OpenCV 16-bit monochrome image Im storing to
dvImg = cvCreateImage( imgSz, 16, 1 );
//loop through the image
for (int i = 0; i < imgSz.height; i++ ) {
for (int j = 0; j < imgSz.width; j++ ){
if ( detail[i][j] <= 0.0){
//make sure no negative values
detail[i][j] = 0.0;
}
//assign to opencv image
((ushort*)(dvImg->imageData + dvImg->widthStep*i))[j] = (short) (detail[i][j]);
}
}
Naively I thought I could simply replace this to cv::Mat for C++ API like this:
cv::Mat dvImg( imgSz, CV_16U);
And instead of:
((ushort*)(dvImg->imageData + dvImg->widthStep*i))[j] = (short) (detail[i][j]);
I would do:
dvImg.at<ushort>(j,i) = (short) (detail[i][j]);
But this doesnt seem to work, output is all scrambled, there are some particulars of how widthStep works that I seem to miss.
Helpful for any input.