程序报错,不知道哪里错了,求助

明源123 2013-12-19 08:30:38


// tiqu.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include "cxcore.h"
#include "highgui.h"
#include "cv.h"
#include <fstream>
#define MAXL 10000000
double d[MAXL][3];
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
IplImage* img = cvLoadImage("D://tupian2.jpg",-1);
long t=0;
CvScalar p;
ofstream outfile("D:\\RGB.txt");
for(int i=0;i<img->width;i++)
{
for(int j=0;j<img->height;j++)
{
p = cvGet2D(img,i,j);//(j,i)
outfile<<p.val[0]<<" ";
outfile<<p.val[1]<<" ";
outfile<<p.val[2]<<" ";
outfile<<endl;
}
}
return 0;
}
...全文
219 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SKATE11 2013-12-20
  • 打赏
  • 举报
回复
智者的梦再美,也不如愚人实干的步伐! 讲一千遍理论,不如写一行代码! 任何语言不落实到实际行动上都等于白说, 没读过MSDN例子代码的程序员实在让人感到可怕! 用C语言1000行源码能完成的工作千万不要用C++重写, 整天把高级技术放在嘴边那是一种浮夸! 少年啊,千万要重视单步调试和设置断点, 用VC调试时记得按下Alt+5、Alt+6、Alt+7和Alt+8。 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时 候。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文 字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针 的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 进程都退出了,输入缓冲区刷不刷新都无关痛痒。 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
logiciel 2013-12-20
  • 打赏
  • 举报
回复
p = cvGet2D(img,i,j);//(j,i) 试改为 p = cvGet2D(img,j,i);//(j,i) 以下来自http://bbs.csdn.net/topics/390673825 对于图像中的某一像素点 P(x, y), 在我们正常的坐标系中,x代表其横坐标,y代表其纵坐标,而在opencv的函数 cvGet2D()与cvSet2D() 中,却行不通。cvGet2D() 的函数原型是 : CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1); 函数返回的是一个CvScalar 容器,其参数中也有两个方向的坐标,但跟我们平常习惯的坐标不一样的是,idx0代表是的行,即高度,对应于我们平常坐标系的y, idx1代表的是列,即宽度,对应于我们平常坐标系的x,cvSet2D() 也类似。所以在使用cvSet2D() 与 cvGet2D() 时,千万要注意坐标的顺序。
明源123 2013-12-20
  • 打赏
  • 举报
回复
引用 2 楼 logiciel 的回复:
p = cvGet2D(img,i,j);//(j,i) 试改为 p = cvGet2D(img,j,i);//(j,i) 以下来自http://bbs.csdn.net/topics/390673825 对于图像中的某一像素点 P(x, y), 在我们正常的坐标系中,x代表其横坐标,y代表其纵坐标,而在opencv的函数 cvGet2D()与cvSet2D() 中,却行不通。cvGet2D() 的函数原型是 : CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1); 函数返回的是一个CvScalar 容器,其参数中也有两个方向的坐标,但跟我们平常习惯的坐标不一样的是,idx0代表是的行,即高度,对应于我们平常坐标系的y, idx1代表的是列,即宽度,对应于我们平常坐标系的x,cvSet2D() 也类似。所以在使用cvSet2D() 与 cvGet2D() 时,千万要注意坐标的顺序。
已经解决
明源123 2013-12-20
  • 打赏
  • 举报
回复
引用 7 楼 CKnightx 的回复:
调试一下,把height和width都打印出来,然后在访问每一位的RGB的时候,也打印出当前的i和j,应该是越界
谢谢,已经解决
Xomic 2013-12-20
  • 打赏
  • 举报
回复
引用 3 楼 SKATE11 的回复:
智者的梦再美,也不如愚人实干的步伐! 讲一千遍理论,不如写一行代码! 任何语言不落实到实际行动上都等于白说, 没读过MSDN例子代码的程序员实在让人感到可怕! 用C语言1000行源码能完成的工作千万不要用C++重写, 整天把高级技术放在嘴边那是一种浮夸! 少年啊,千万要重视单步调试和设置断点, 用VC调试时记得按下Alt+5、Alt+6、Alt+7和Alt+8。 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时 候。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文 字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针 的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 进程都退出了,输入缓冲区刷不刷新都无关痛痒。 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
马甲
  • 打赏
  • 举报
回复
调试一下,把height和width都打印出来,然后在访问每一位的RGB的时候,也打印出当前的i和j,应该是越界
  • 打赏
  • 举报
回复
一看到这两个for循环,我就感觉引起dump的是数据越界
赵4老师 2013-12-20
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
hui211314ddhui 2013-12-20
  • 打赏
  • 举报
回复
引用 3 楼 SKATE11 的回复:
智者的梦再美,也不如愚人实干的步伐! 讲一千遍理论,不如写一行代码! 任何语言不落实到实际行动上都等于白说, 没读过MSDN例子代码的程序员实在让人感到可怕! 用C语言1000行源码能完成的工作千万不要用C++重写, 整天把高级技术放在嘴边那是一种浮夸! 少年啊,千万要重视单步调试和设置断点, 用VC调试时记得按下Alt+5、Alt+6、Alt+7和Alt+8。 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时 候。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文 字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针 的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 进程都退出了,输入缓冲区刷不刷新都无关痛痒。 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山!
zhao4zhong1 马甲? 小号? 亲戚? 粉丝? 还是。。。另外一位老湿啊?
明源123 2013-12-19
  • 打赏
  • 举报
回复

抱着个错误,自己实在是找不到了。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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