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
OpenCV:掩模和ROI之间的区别_Opencv_Roi - Fatal编程技术网

OpenCV:掩模和ROI之间的区别

OpenCV:掩模和ROI之间的区别,opencv,roi,Opencv,Roi,我试图在图像中设置一个带有角度的ROI。起初,我认为使用遮罩可以得到与在IplImage结构中设置ROI相同的结果。然后,我会像使用ROI一样使用cvResize,但这次是一个面具 然而,这显然不是那么容易,因为角度 有没有办法将任何矩形的内部以任何角度复制到一个新的IplImage中,这个IplImage的大小就是这个矩形 CvSeq*approximatedContour=cvApproxPoly(当前轮廓, sizeof(CvContour), 0, CV_POLY_近似值_DP, 8);

我试图在图像中设置一个带有角度的ROI。起初,我认为使用遮罩可以得到与在IplImage结构中设置ROI相同的结果。然后,我会像使用ROI一样使用cvResize,但这次是一个面具

然而,这显然不是那么容易,因为角度

有没有办法将任何矩形的内部以任何角度复制到一个新的IplImage中,这个IplImage的大小就是这个矩形

CvSeq*approximatedContour=cvApproxPoly(当前轮廓,
sizeof(CvContour),
0,
CV_POLY_近似值_DP,
8);
//多角形圆槽
etiquetteBox=CVMinarealect2(近似轮廓);
CvPoint2D32f箱点[4];
CvPoint2D32f*c1=(&CvPoint2D32f(0,0),
&CV2D32F(200,0),
&CV2D32F(0200),
&CV2D32F(200200));
CvMat*mmat=cvCreateMat(3,3,CV_32FC1);
cvBoxPoints(礼盒、boxPoints);
IplImage*mask=cvCreateImage(cvSize(in->width,in->height),IPL_DEPTH_8U,1);
IplImage*ROIimg=cvCreateImage(cvSize(in->width,in->height),IPL_DEPTH_8U,1);
抽屉(面具、礼盒、目标颜色[3]);
cvAnd(thresImg,mask,roimg,mask);
如果(voirSeuillage)
CVT颜色(ROIimg、in、CV_GRAY2BGR)//Roimg在这里很好!
mmat=cvGetPerspectiveTransform(箱点,c1,mmat);
cvWarpPerspective(ROIimg、thresImgResized、mmat);//在这里,我得到一个完整的黑色图像!
这样做,正如Banthar善意地建议的那样,我得到的是一个全黑图像,而不是ROIimg中由boxPoints分隔的图像,这段代码有什么问题

应用答案后: 我现在做的是:

双角度=0。;
//TODO自适应角度补偿
如果(abs(礼盒角度)>30)
角度=礼仪盒。角度+270。;
其他的
角度=礼仪盒。角度-270。;
CvPoint2D32f箱点[4];
CvPoint2D32f c1[]={CvPoint2D32f(0,0),
CV2D32F(20,0),
CV2D32F(20,20),
CV2D32F(0,20)};
CvMat*mmat=cvCreateMat(3,3,CV_32FC1);
cvBoxPoints(礼盒、boxPoints);
点中心=点(10,10);
//扭曲图像以使多边形适合20x20图像
mmat=cvGetPerspectiveTransform(箱点,c1,mmat);
CVT透视图(thresImg、thresImgResized、mmat);
//旋转图像,因为etiquetteBox的角度不一致
//从一帧到下一帧。。。
//找到解决这个问题的方法会很酷。。。
CvMat rot_mat=getRotationMatrix2D(中心,角度,1.0);
CVWAPPRAFINE(树脂化、旋转式和旋转式);
它仍然不是我想要的,因为对象正在旋转到20x20的旋转模式;在thresImgResized中,在CVWAPPROPECTION之后,对象被很好地分割,但由于etiquetteBox的角度不一致(在一帧中为-0度,在下一帧中为-90度,取决于我如何保持要检测的对象),因此对象被反向分割,我通过以下方式得到:
cvFindContours(dilImage,
轮廓存储,
&轮廓,
sizeof(CvContour),
简历列表,
CV_链_约_TC89_KCOS);
//多角裤
CvSeq*当前轮廓=轮廓;
while(currentContour!=0&&
{
CvSeq*近似轮廓=cvApproxPoly(当前轮廓,
sizeof(CvContour),
0,
CV_POLY_近似值_DP,
9);
//多角形圆槽
etiquetteBox=CVMinarealect2(近似轮廓);

我不知道如何解决这个问题,但至少,这比设置IplImage ROI要好,因为我会在连续的帧中补偿etiquetteBox的角度从-0度到-90度的变化。

您在
c1
的定义中使用了错误的括号。请尝试以下方法:

    CvPoint2D32f c1[] = {
                        cvPoint2D32f(0,200),
                        cvPoint2D32f(0,0),
                        cvPoint2D32f(200,0),
                        cvPoint2D32f(200,200),
    };

您在
c1
的定义中使用了错误的括号。请尝试以下操作:

    CvPoint2D32f c1[] = {
                        cvPoint2D32f(0,200),
                        cvPoint2D32f(0,0),
                        cvPoint2D32f(200,0),
                        cvPoint2D32f(200,200),
    };

您可以使用
cvGetPerspectiveTransform
CVWarpPerspectiveTransform
进行转换。在CvMat*cvGetPerspectiveTransform(const-CvPoint2D32f*src,const-CvPoint2D32f*dst,CvMat*mapMatrix)中,src将是我盒子点中的4个点,而dst则是点[0,0],[0,destImg->宽度],[destImg->高度,0],[destImg->高度,destImg->宽度]?是的。我不确定顶点的顺序,但你会看到是否需要交换它们。我在谷歌上搜索了一下,顶点的顺序似乎很好;但是它的行为很奇怪,我得到了一张全白色的图像…见上面的编辑实际上我得到了一张全黑色的图像…你可以使用
cvGetPerspectiveTransform
cvwarpperpspectiv来完成e
。在CvMat*cvGetPerspectiveTransform(常量CvPoint2D32f*src,常量CvPoint2D32f*dst,CvMat*mapMatrix)中,src将是我的boxPoints中的4个点,而dst则是点[0,0],[0,Desting->width],[Desting->height,0],[Desting->height,Desting->width]?是的。我不确定顶点的顺序,但你会看到是否需要交换它们。我在谷歌上搜索了一下,顶点的顺序似乎很好;但是它的行为很奇怪,我得到了一张全白色的图像…见上面的编辑实际上我得到了一张全黑色的图像。。。