作者chuinzong (阿荣)
看板C_and_CPP
标题[问题] QT及OpenCV编译问题
时间Thu Mar 28 13:57:14 2019
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux Ubumtu 16.04 QT5.5.1
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
QT GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
OpenCV 4.0.0
问题(Question):
在编译过程中,若是要修改影像内的pixel值就会出现如下错误:
The program has unexpectedly finished.
可是将 /*pchRowData[j] = 0;*/ 注解掉,就可以解决问题。
我查询此错误代码可能会发生的情况,大多都解释为资料没有new的情况。
可是我这也不是要new的资料(是cv::Mat cvEdgeImg)
喂入的资料(Input):
uchar* pchRowData = NULL;
pchRowData = cvEdgeImg.ptr<uchar>(cvEdgeImg.cols);
for(int j=cvEdgeImg.rows-1 ; j>=0 ; j--)
{
if(!bEverPaint)
{
if(pchRowData[j]==255)
{
bEverPaint = true;
}
}
else
{
pchRowData[j] = 0; /*此行*/
}
}
预期的正确结果(Expected Output):
编译可以通过
错误结果(Wrong Output):
The program has unexpectedly finished.
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
using namespace cv;
Mat cvEdgeImg;
.
.
.
Canny( cvDilaImg, cvEdgeImg, 50, 150, 3);
for(int i=0 ; i<cvEdgeImg.cols ; i++)
{
uchar* pchRowData = NULL;
pchRowData = cvEdgeImg.ptr<uchar>(cvEdgeImg.cols);
bool bEverPaint = false;
for(int j=cvEdgeImg.rows-1 ; j>=0 ; j--)
{
if(!bEverPaint)
{
if(pchRowData[j]==255)
{
bEverPaint = true;
}
}
else
{
// pchRowData[j] = 0;
//上行注解掉编译就会产生The program has unexpectedly finished.
}
}
}
imwrite("OutputEdgeImg.bmp",cvEdgeImg);
补充说明(Supplement):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.117.38.5
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1553752636.A.9F6.html
※ 编辑: chuinzong (122.117.38.5), 03/28/2019 14:00:08
1F:→ nh60211as: 都用opencv4了就别用那麽旧的语法,改用.at<uchar> 03/28 14:14
2F:→ nh60211as: 或是抓submatrix来存取吧 03/28 14:14
3F:→ chuinzong: 由於我用cvEdgeImg.at<char>(i,j) = 255; 还是会有状况 03/28 14:27
4F:→ chuinzong: 那我用看submatrix试试看 03/28 14:27
5F:→ chuinzong: The program has unexpectedly finished. 03/28 14:32
6F:→ chuinzong: .../ProjectIamge crashed 03/28 14:33
7F:→ nh60211as: pchRowData = cvEdgeImg.ptr<uchar>(cvEdgeImg.cols); 03/28 14:49
8F:→ nh60211as: 这一行是代表你每一个回圈都固定抓影像的同一个row 03/28 14:50
9F:→ nh60211as: 这是你要的写法吗?另外用.ptr应该还要先检查这个matri 03/28 14:51
10F:→ nh60211as: 是不是连续的 03/28 14:52
11F:→ nh60211as: 更正,是每一个回圈抓固定的起始点 03/28 14:57
12F:→ chuinzong: pchRowData = cvEdgeImg.ptr<uchar>(i);已经改成i还是 03/28 15:18
13F:→ chuinzong: 会有一样状况 03/28 15:18
14F:→ nh60211as: 正确的输入方式是.at<char>(row,col),我觉得你应该先 03/28 15:21
15F:→ nh60211as: 学一下opencv的语法或去看documentation,这个程式码 03/28 15:22
16F:→ nh60211as: 太难了 03/28 15:22
17F:→ chuinzong: Ok,我知道问题在哪了!那我在看下文件,谢谢~ 03/28 15:32
18F:推 flyfoxy: j>=0;j— 表示j有可能是-1 03/28 22:10