根据提供的代码,以下是修复潜在问题并优化的版本:
#include <opencv2/opencv.hpp>
int main(int argc, char* argv[])
{
cv::Mat src = cv::Mat(768, 1024, CV_8UC1, cv::Scalar::all(128));
cv::circle(src, cv::Point(300, 300), 200, cv::Scalar::all(78), -1);
cv::rectangle(src, cv::Rect(300, 400, 73, 87), cv::Scalar::all(197), -1);
cv::rectangle(src, cv::Rect(410, 100, 387, 173), cv::Scalar::all(154), -1);
cv::line(src, cv::Point(560, 612), cv::Point(760, 415), cv::Scalar::all(96), 3);
//cv :: line(src,cv :: Point(1124、484),cv :: Point(512、968),cv :: Scalar :: all(56),400);
// 上述行中点坐标超出图像范围,请注释掉该行
// 显示原始图像
cv: : imshow("SourceImage",src) ;
/ * 这里可能需要加上一个延迟来显示图像。
在Windows下,可以使用:
int key = cv :: waitKey(0); 或者
while(true)
{
if(cv ::waitKey(1)==27)
break;
}
确保窗口不会立即关闭。*/
std: : vector<std::vector<cv ::Point>> contour;
cv :: findContours(src.clone(),contour,cv ::RETR_EXTERNAL,cv ::CHAIN_APPROX_SIMPLE);
if(!contour.empty())
{
cv :: Mat dst;
cv::cvtColor(src, dst, CV_GRAY2BGR); // 将灰度图转换为彩色图像
for(const auto & pts : contour)
for(const auto & pt : pts)
dst.at<cv::Vec3b>(pt) = cv::Vec3b(0, 0, 255);
// 显示结果图像
cv: : imshow("Result",dst);
/* 这里也可能需要加上一个延迟来显示图像。
在Windows下同样可以使用:
int key = cv::waitKey(0); 或者
while(true)
{
if(cv::waitKey(1)==27)
break;
}
确保窗口不会立即关闭。*/
}
else
{
std::cout << "未成功提取到轮廓点!" << std::endl;
}
return 0;
}
修复的问题:
- 注释掉了超出图像范围的一行代码
cv::line(src, cv::Point(1124, 484), cv::Point(512, 968), cv::Scalar::all(56), 400);
。 - 添加了注释部分来确保显示的窗口不会立即关闭。
内容由零声教学AI助手提供,问题来源于学员提问