qq_41517828 2018-10-14 14:05 采纳率: 25.9%
浏览 980

opencv 相关问题,矩形也能排序?

代码如下,那句sort(RectCompList.begin(),RectCompList.end()); 是什么意思,RectCompList 不是Rectcomp 类型吗,里面的元素不是矩形吗,要怎么排序??
#include
#include
#include "opencv2/imgproc.hpp"
#include
#include

using namespace cv;
using namespace std;

#include

class RectComp
{

public:
Rect rm;

RectComp(Rect rms)

{

rm = rms;

}

bool operator < (const RectComp& ti) const

{

return rm.x< ti.rm.x;

}

};
int main()

{

//装载图片

Mat srcImage1= imread("D:\opencv_image\images\20150820103614491.png");

namedWindow("hello-1", 1);

imshow("hello-1", srcImage1 );
Mat srcImage2,srcImage3,srcImage4,srcImage5;

//图片变成灰度图片

cvtColor(srcImage1,srcImage2,CV_BGR2GRAY);

//图片二值化

threshold(srcImage2,srcImage3,200,255,THRESH_BINARY_INV);

//确定腐蚀和膨胀核的大小

Mat element = getStructuringElement(MORPH_RECT, Size(4, 4));

//腐蚀操作

erode(srcImage3,srcImage4,element);

//膨胀操作

dilate(srcImage4,srcImage5,element);

namedWindow("hello-5", 1);

imshow("hello-5", srcImage5 );

//确定每张答题卡的ROI区域

Mat imag_ch1 = srcImage5(Rect(0,30,100,60));

namedWindow("img1", 1);

imshow("img1",imag_ch1);

//提取已经涂好了的选项

std::vectorstd::vector<cv::Point > chapter1;

findContours(imag_ch1,chapter1,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);

Mat result(imag_ch1.size(), CV_8U , cv::Scalar(255)) ;

cv::drawContours(result,chapter1,-1,cv::Scalar(0),2);

namedWindow("resultImage", 1);

cv::imshow("resultImage" , result);

vector<RectComp>RectCompList;  
for(int i = 0;i<chapter1.size();i++)  
{  
    Rect rm= cv::boundingRect(cv::Mat(chapter1[i]));  
    RectComp *ti = new RectComp(rm);  
    RectCompList.push_back(*ti);  
    //         printf("Rect %d x = %d,y = %d \n",i,rm.x,rm.y);  
}  
sort(RectCompList.begin(),RectCompList.end());  
map<int,string>listenAnswer;  
//判断这部分的答题卡是否都已涂上  
for(int t = 0;t<RectCompList.size();t++)  
{  
    if(RectCompList.at(t).rm.y<=22)  
    {  
        listenAnswer[t] = "A";  
    }  
    else if((RectCompList.at(t).rm.y>22)&&(RectCompList.at(t).rm.y<=34))  
    {  
        listenAnswer[t] = "B";  
    }  
    else if(RectCompList.at(t).rm.y>34)  
    {  
        listenAnswer[t] = "C";  
    }  
    printf("sorted %d x = %d,y = %d \n",t,RectCompList.at(t).rm.x,RectCompList.at(t).rm.y);  
}  
for(map<int,string>::iterator it = listenAnswer.begin();it!=listenAnswer.end();++it)  
{  
    cout<<"num:"<<it->first+1<<","<<"answer:"<<it->second<<endl;  
}  
waitKey(0);  
return 0;  

}

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-10-14 16:11
    关注

    bool operator < (const RectComp& ti) const
    {
    return rm.x< ti.rm.x;
    }

    既然这么定义,那么就是按照其x的值排序了。

    评论

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法