opencv给图像像素赋值问题

Mayday_cc 2015-01-27 11:09:26
我想把一副图像中的像素值为30的点 都改为像素值为0,像素值不等于30的 都改为255,我写的程序是这样的,但是运行的时候总是会停止.exe,请大家帮我看一下哪里有出错,谢谢~
[code=c]#include "cv.h"
#include "highgui.h"
#include "cvcam.h"
#include "cxcore.h"
#include "stdlib.h"
#include "tchar.h"
int main(int argc,char **argv)
{
IplImage*src=NULL;
src=cvLoadImage("wiener.bmp",0);
for(int i=0;i<src->height;i++)
{
for(int j=0;j<src->width;j++)
{
if(((uchar *)(src->imageData + i*src->widthStep))[j]==30)
{
((uchar *)(src->imageData + i*src->widthStep))[j]=0;

}
else
((uchar *)(src->imageData + i*src->widthStep))[j]=255;

}
}
cvSaveImage("gray_30.bmp",src);
return 0;
}
[/code]



图像上传的是jpg格式的,但是我做像素赋值之前处理了一下,用的是.bmp格式的灰度图像
...全文
860 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2015-01-30
  • 打赏
  • 举报
回复
一副图像中的像素值为30的点 ? 你这个是彩色图像啊,三个通道呢,怎么算的。。。 cvtcolor转换成灰度图才行吧
赵4老师 2015-01-30
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
robertbo 2015-01-29
  • 打赏
  • 举报
回复
不好意思,写错了应该是pData = (LPBYTE)src->imageData+src->widthStep*i; 指向第i行像素的起始位置,这样在下一个for循环中直接使用pData[j]就可以
kebiowen 2015-01-29
  • 打赏
  • 举报
回复
引用 4 楼 robertbo 的回复:
不用预处理,直接加载jpg格式的图像就可以,因为你是使用cvLoadImage("wiener.bmp",0);第二个参数决定了图像是以灰度图像的格式加载进来的。看代码逻辑没有问题,楼主可以debug跟踪一下是在cvLoadImage返回的是不是NULL,或者在save的时候是不是出错了。 楼主这种处理像素代码影响效率的 IplImage*src=NULL; src=cvLoadImage("wiener.bmp",0); if(src==NULL) { return -1; } LPBYTE pData = (LPBYTE)src->imageData; for(int i=0;i<src->height;i++) { pData = (LPBYTE)src->imageData+src->widthStep; for(int j=0;j<src->width;j++) { if( pData[j]==30 ) { pData[j] = 0; } else { pData[j] = 255; } } } cvSaveImage("gray_30.bmp",src);
我想问一下你的for循环里面的pData = (LPBYTE)src->imageData+src->widthStep;有什么作用?
lx624909677 2015-01-28
  • 打赏
  • 举报
回复
点重试,看看代码断在了哪一行
robertbo 2015-01-28
  • 打赏
  • 举报
回复
不用预处理,直接加载jpg格式的图像就可以,因为你是使用cvLoadImage("wiener.bmp",0);第二个参数决定了图像是以灰度图像的格式加载进来的。看代码逻辑没有问题,楼主可以debug跟踪一下是在cvLoadImage返回的是不是NULL,或者在save的时候是不是出错了。 楼主这种处理像素代码影响效率的 IplImage*src=NULL; src=cvLoadImage("wiener.bmp",0); if(src==NULL) { return -1; } LPBYTE pData = (LPBYTE)src->imageData; for(int i=0;i<src->height;i++) { pData = (LPBYTE)src->imageData+src->widthStep; for(int j=0;j<src->width;j++) { if( pData[j]==30 ) { pData[j] = 0; } else { pData[j] = 255; } } } cvSaveImage("gray_30.bmp",src);
  • 打赏
  • 举报
回复
对不起,没仔细看,不是彩色的问题。。。楼主你单步调试一下,看看问题出在哪一句
  • 打赏
  • 举报
回复
楼主,你这个图像是三通道的,不能简单的赋值为255或者30。 建议先区分图像的类型:灰度图和彩色图
Evankaka 2015-01-27
  • 打赏
  • 举报
回复
你这是实现图像分割,可以直接用函数来实现(哪个我忘了,可以设置参数的)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧