Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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
Android OpenCV作物功能致命信号11_Android_Opencv_Crop - Fatal编程技术网

Android OpenCV作物功能致命信号11

Android OpenCV作物功能致命信号11,android,opencv,crop,Android,Opencv,Crop,你好,我正在做一个android应用程序,它使用OpenCV来检测矩形/正方形,为了检测它们,我正在使用squares.cpp中的函数(稍微修改)。找到的每个正方形的点都存储在vector>squares中,然后我将其传递给选择最大一个的函数,并将其存储在vector theBiggestSq中。问题在于裁剪功能,我将在下面粘贴代码(我也会将显示问题的链接发布到youtube)。如果实际的正方形离相机足够远,它就可以正常工作,但是如果我在某个点把它关上一点,它就会挂起来。我将从LogCat发布问

你好,我正在做一个android应用程序,它使用OpenCV来检测矩形/正方形,为了检测它们,我正在使用squares.cpp中的函数(稍微修改)。找到的每个正方形的点都存储在vector>squares中,然后我将其传递给选择最大一个的函数,并将其存储在vector theBiggestSq中。问题在于裁剪功能,我将在下面粘贴代码(我也会将显示问题的链接发布到youtube)。如果实际的正方形离相机足够远,它就可以正常工作,但是如果我在某个点把它关上一点,它就会挂起来。我将从LogCat发布问题的打印屏幕,并打印出点(从最大SQ向量中获取的边界点,可能有助于找到解决方案)

void cut并保存(矢量最大的SQ,Mat图像){
旋转选框=最小选框(最大选框);
//在原始图像中绘制边界框(调试目的)
//cv::Point2f顶点[4];
//点(顶点);
//对于(int i=0;i<4;++i)
//{
//cv::line(img,顶点[i],顶点[(i+1)%4],cv::Scalar(0,255,0),1,cv_AA);
//}
//cv::imshow(“盒子”,img);
//cv::imwrite(“box.png”,img);
//将感兴趣区域设置为框定义的区域
直接感兴趣区;
roi.x=box.center.x-(box.size.width/2);
roi.y=box.center.y-(box.size.height/2);
roi.width=box.size.width;
roi.height=box.size.height;
//将原始图像裁剪到定义的ROI
//bmp=Bitmap.createBitmap(box.size.width/2,box.size.height/2,Bitmap.Config.ARGB_8888);
Mat裁剪=图像(roi);
//Mat-crop=image(Rect(roi.x,roi.y,roi.width,roi.height)).clone();
//Utils.matToBitmap(crop*.clone()*,bmp);
imwrite(“/sdcard/OpenCVTest/1.png”,bmp);
imshow(“作物”,作物);
}

分别打印的跳线为:roi.x roi.y roi.width roi.height

另一个问题是,绘制的边界应该是绿色的,但正如您在视频中看到的那样,它们是扭曲的(像那些边界是由玻璃制成的一样弯曲?)

谢谢你的帮助。我是openCV的新手,从一个月开始做这件事,所以请宽容

编辑: 图纸代码:

//draw//
    for( size_t i = 0; i < squares.size(); i++ )
    {
        const Point* p = &squares[i][0];
        int n = (int)squares[i].size();
        polylines(mBgra, &p, &n, 1, true, Scalar(255,255,0), 5, 10);
        //Rect rect = boundingRect(cv::Mat(squares[i]));
        //rectangle(mBgra, rect.tl(), rect.br(), cv::Scalar(0,255,0), 2, 8, 0);

    }
//绘制//
对于(size_t i=0;i
此错误基本上告诉您原因-您的ROI超过了图像尺寸。这意味着,当您从
RotatedRect box
提取
Rect roi
时,x或y小于零,或者宽度/高度将尺寸推到图像外部。你应该用类似的方法来检查

// Propose rectangle from data
int proposedX = box.center.x - (box.size.width / 2);
int proposedY = box.center.y - (box.size.height / 2);
int proposedW = box.size.width;
int proposedH = box.size.height;

// Ensure top-left edge is within image
roi.x = proposedX < 0 ? 0 : proposedX;
roi.y = proposedY < 0 ? 0 : proposedY;

// Ensure bottom-right edge is within image
roi.width = 
   (roi.x - 1 + proposedW) > image.cols ? // Will this roi exceed image?
   (image.cols - 1 - roi.x)               // YES: make roi go to image edge
   : proposedW;                           // NO: continue as proposed
// Similar for height
roi.height = (roi.y - 1 + proposedH) > image.rows ? (image.rows - 1 - roi.y) : proposedH;
//从数据中建议矩形
int proposedX=box.center.x-(box.size.width/2);
int proposedY=框中心y-(框大小高度/2);
int proposedW=box.size.width;
int proposedH=框尺寸高度;
//确保左上边缘在图像内
roi.x=提议的x<0?0:proposedX;
投资回报率y=建议投资回报率y<0?0:被提议的;
//确保右下边缘在图像内
roi.width=
(roi.x-1+proposedW)>image.cols?//这个roi会超过图像吗?
(image.cols-1-roi.x)//是:使roi转到图像边缘
:proposedW;//否:按提议继续
//身高差不多
roi.height=(roi.y-1+proposedH)>image.rows?(image.rows-1-roi.y):建议的h;

因此,这应该可以防止再次发生此错误,或者只是为了确认“宽度/高度将尺寸推到图像外部”?我没有测试它,但它应该确保roi始终在图像内部,无论返回什么框,我相信是roi在图像外部导致了错误。好的,谢谢!我现在就试试,很快就会公布结果。最后一件事:你知道为什么绘制矩形/正方形的边界很奇怪吗?应该是绿色的,但正如你们在视频中看到的,它们是白色的玻璃状的东西?(难以描述)。不确定,我看不出代码中矩形的绘制位置。如果有帮助的话,您应该使用
cv::rectangle
函数……看起来您的解决方案现在可以工作了,因为它现在可以编写文件代码行了!:)这仍然是一些东西,但它显示了一些问题,根据保存在SD卡上:也许这只能保存iplimage?不是席子?编辑了帖子:添加了图形代码
// Propose rectangle from data
int proposedX = box.center.x - (box.size.width / 2);
int proposedY = box.center.y - (box.size.height / 2);
int proposedW = box.size.width;
int proposedH = box.size.height;

// Ensure top-left edge is within image
roi.x = proposedX < 0 ? 0 : proposedX;
roi.y = proposedY < 0 ? 0 : proposedY;

// Ensure bottom-right edge is within image
roi.width = 
   (roi.x - 1 + proposedW) > image.cols ? // Will this roi exceed image?
   (image.cols - 1 - roi.x)               // YES: make roi go to image edge
   : proposedW;                           // NO: continue as proposed
// Similar for height
roi.height = (roi.y - 1 + proposedH) > image.rows ? (image.rows - 1 - roi.y) : proposedH;