将IplImage*传递给函数,原始未更新
Passing IplImage * to function, original not getting updated
我在函数中传递IplImage*参数时遇到问题。这是一个学校项目,不幸的是,我不应该编辑调用我的过滤器函数的文件。在主要情况下,图像被作为命令行参数引入,然后将其复制并传递给正确的过滤器功能,例如:
IplImage * floating = cvCreateImage (cvSize (img->width, img->height), IPL_DEPTH_32F, 3);
cvConvertScale (img, floating, 1/255., 0);
IplImage * filtered;
switch (filter.ImageFormat)
{
case YUV24:
filtered = cvCreateImage (cvSize (floating->width, floating->height), IPL_DEPTH_32F, 3);
cvCvtColor (floating, filtered, CV_BGR2YCrCb);
break;
case BGR24:
filtered = cvCloneImage (floating);
break;
case Gray:
filtered = cvCreateImage (cvSize (floating->width, floating->height), IPL_DEPTH_32F, 1);
cvCvtColor (floating, filtered, CV_BGR2GRAY);
break;
}
cvNamedWindow ("original", CV_WINDOW_AUTOSIZE);
cvShowImage ("original", img);
filter.ImageFilter (filtered, p);
if (filter.ImageFormat == YUV24)
{
cvCvtColor (filtered, filtered, CV_YCrCb2BGR);
}
cvNamedWindow (filterName.c_str(), CV_WINDOW_AUTOSIZE);
cvShowImage (filterName.c_str(), filtered);
这是我的一个过滤器的代码:
void median (IplImage * image, int k){
cout << "image address: " << &image << endl;
Mat matImage(image); //convert IplImage to Mat for work
vector<Mat> bgr_channels; //vector to hold each channel
int i,j,m,n; //row/column indeces
int kernelSize = (2*k+1)*(2*k+1);
vector<float> vals(kernelSize); //kernelSized vector to hold all values of image
//within kernel centered at a given pixel
int vecIndex = 0; //then sorted to get the median
int chanIndex = 0; //index used to for each channel
//add padding to account for border issues with convolution
copyMakeBorder( matImage, matImage, k, k, k, k, BORDER_REPLICATE);
//split channes to do work on individual channels
split(matImage, bgr_channels);
for(chanIndex=0; chanIndex < matImage.channels(); chanIndex++){
//outer loop for scanning entire image
for(i=k; i<matImage.rows-k; i++)/*image row index*/{
for(j=k; j<matImage.cols-k; j++)/*image column index*/{
//inner loop for scanning image only in kernel boundaries
vecIndex = 0; //reset vecIndex at start of each kernel loop
for(m=i-k; m<(i+k+1); m++)/*kernel row index*/{
for(n=j-k; n<(j+k+1); n++)/*kernel column index*/{
vals[vecIndex++] = bgr_channels[chanIndex].at<float>(m,n);
}
}
insertionSort(vals, 0, vals.size()-1); //insertion sort from CSCI362 text, see references
bgr_channels[chanIndex].at<float>(i,j) = vals[vals.size()/2]; //new value chosen from middle element //of sorted vector
}
}
}
merge(bgr_channels, matImage); //merge channels together
imshow("Median: Mat", matImage); //left this in becuase the original doesn't seem to get modified
//when converting the Mat back to an IplImage
image = cvCloneImage(&(IplImage)matImage); //convert backto IplImage for DesktopMain
}
问题是,主要显示的过滤图像并不能反映实际图像。它只显示原始图像。当我将Mat样式的图像matImage输出到我的filter函数中时,它会显示过滤后的图像。在我转换回IplImage并将IplImage*输入参数设置为等于转换后的过滤版本之后。但这些变化并不能反映主功能中显示的图像。
这使得我很难创建其他一些过滤器,如Gaussian和Sobel,因为这些过滤器本身在进行操作之前会调用其他函数,而我不会得到编辑后的数据。在如何编辑传递的IplImage*变量方面,我是否缺少一些东西?
提前感谢您的帮助!
您的函数从不编辑传递给它的图像。
这行大概是在复制图像。
Mat matImage(image); //convert IplImage to Mat for work
然后您的代码修改matImage
副本。
在函数结束时,该本地副本被销毁,并且image
指向的IplImage
从未被修改。
编辑:Vaughn Cato的回答具体说明了如何解决这个问题。
而不是这个:
image = cvCloneImage(&(IplImage)matImage);
使用这个:
cvCopy(&(IplImage)matImage,image);
要遍历3个通道,应该使用迭代器:
Mat out;
*********open out********
Mat_<Vec3b>::iterator it = out.begin<Vec3b>();
MatConstIterator_<Vec3b> it_end = out.end<Vec3b>();
for(; it != it_end; ++it)
{
//your 3 channels
(*it)[0] = ...;
(*it)[1] = ....;
(*it)[2] = ......;
}
相关文章:
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- cmake更新缓存的变量
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 更新到莫哈韦后出现cmath错误
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- OpenMP:并行更新数组总是需要减少数组吗
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- 更新的矢量元素不打印
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 如何在ECS框架中更新组件数据和通知系统
- 如何使用C++相对于其原始值更新 SQLite 行
- 重载运算符保持变量更新,而不是保持原始变量
- 将IplImage*传递给函数,原始未更新