Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将wxString转换为OpenCv的std::string_C++_Opencv_Wxwidgets - Fatal编程技术网

C++ 将wxString转换为OpenCv的std::string

C++ 将wxString转换为OpenCv的std::string,c++,opencv,wxwidgets,C++,Opencv,Wxwidgets,有人知道为什么每次代码解析这行代码时我的应用程序都会崩溃: deskew(filename); //filename string 我的声明如下: void deskew(std::string fname); 然后我还使用以下代码将wxString转换为string: string fname = string(path.mb_str()); 我刚从教程中读到它,但它不起作用。 顺便说一下,我使用的是我的C++的WxWIDGET。 以下是deskew的正文: void DImage::d

有人知道为什么每次代码解析这行代码时我的应用程序都会崩溃:

deskew(filename); //filename string
我的声明如下:

void deskew(std::string fname);
然后我还使用以下代码将wxString转换为string:

string fname = string(path.mb_str());
我刚从教程中读到它,但它不起作用。 顺便说一下,我使用的是我的C++的WxWIDGET。 以下是deskew的正文:

void DImage::deskew(string filename, unsigned int angle)
{

if (filename == "")
    return;
Mat img = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);

vector<Point> points;
Mat_<uchar>::iterator it = img.begin<uchar>();
Mat_<uchar>::iterator end = img.end<uchar>();
for (; it != end; ++it)
  if (*it)
    points.push_back(it.pos());

RotatedRect box = minAreaRect(Mat(points));

Mat rot_mat = getRotationMatrix2D(box.center, angle, 1);

Mat rotated;
warpAffine(img, rotated, rot_mat, img.size(), INTER_CUBIC);

Size box_size = box.size;
if (box.angle < -45.)
  swap(box_size.width, box_size.height);
Mat cropped;
  getRectSubPix(rotated, box_size, box.center, cropped);

//imshow("Original", img);
//imshow("Output", rotated);
//imshow("Cropped", cropped);

imwrite("icons/DESKEW.png", cropped);
waitKey(0);
}
void-DImage::deskew(字符串文件名,无符号整数角度)
{
如果(文件名==“”)
返回;
Mat img=imread(文件名、CV\u加载\u图像\u灰度);
矢量点;
迭代器it=img.begin();
迭代器end=img.end();
for(;it!=end;++it)
如果(*it)
点。向后推(it.pos());
RotatedRect box=MinareRect(材料(点));
Mat rot_Mat=getRotationMatrix2D(框中心,角度,1);
垫旋转;
翘曲仿射(img,旋转,旋转垫,img.size(),中间立方);
大小框\大小=框大小;
如果(长方体角度<-45.)
交换(框大小.宽度,框大小.高度);
草席;
getRectSubPix(旋转、长方体大小、长方体中心、裁剪);
//imshow(“原件”,img);
//imshow(“输出”,旋转);
//imshow(“裁剪”,裁剪);
imwrite(“icons/DESKEW.png”,裁剪);
等待键(0);
}

在这里,我刚刚粘贴了所有内容,以便大家都能看到。

使用
wxString::ToStdString()
,即

string fname = path.ToStdString();

编辑:另外,您没有一致地使用
std::
;如果您使用的是
名称空间std那么你根本不需要它;否则,
std::
需要前缀
string
和其他STL类型/函数,无论它们出现在哪里。

我注意到您有:

deskew(filename); //filename string
但是你有

void DImage::deskew(string filename, unsigned int angle)

“angle”参数发生了什么变化?

我认为您可以使用

Mat src_img = imread(mywxstring.mb_str().data());

如果不起作用,请检查映像是否存在,以及imread是否需要\\或/在路径中

但是先生,我只使用wxwidgets 2.8。该功能来自2.9版本,对吗?@kcieraraveug,我不知道,尽管没有这样说。但是如果
ToStdString
不可用,请尝试
string(path.ToAscii())
。这是一个2.9版本
mb_str
应该可以工作,我想还有另一个问题。@mattphillips是的,先生,我一直在使用名称空间,但我只是把它放在那里,因为我认为这会更容易理解。@mattphillips我使用了
字符串(path.ToAscii())
,但它仍然是一样的。除非我遗漏了什么,否则你所做的应该可以工作(虽然我认为你的意思是
std::string fname
)。可能是错误在其他地方-我们可能需要更多的上下文:如何声明/生成
文件名
?deskew
的主体是什么样子的?您是否使用调试器查看其“崩溃”的位置?是否在deskew方法中的某一行中?不,这不是调试器错误。应用程序正在运行,但当我输入时使用deskew函数的事件,这是崩溃发生的地方。我使用windows。崩溃发生在函数中的什么地方?如何知道是字符串而不是OpenCV代码?函数调用的设置方式可能有问题。因为我尝试删除函数
imread(文件名,CV\u LOAD\u IMAGE\u灰度)
,然后崩溃消失了。我一直在想转换中可能有问题。对不起,先生,但在我的第一个代码中,我故意不包含类,以免混淆读者。但在我的程序中,我是这样写的,
文档->deskew(fname,wxAtoi(text))
文档来自DImage类。您可能不会混淆您的读者(谁能说?),但您肯定误导了他们。请发布您的真实代码,否则我们无法帮助您。