Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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和C++。我的问题是如何在骨架图像中提取连接点。我曾尝试开发此代码,但它不起作用,我没有发现错误。提前谢谢 int main( int argc, char** argv ) { cv::Mat im = cv::imread("IMG.jpg",0); if (im.empty()) return -1; cv::Mat img_rgb(im.size(), CV_8UC3); cv::threshold(img_rgb, img_rgb, 155, 255, CV_THRESH_BINARY); cv::cvtColor(im, img_rgb, CV_GRAY2RGB); int s=0; for (int i = 1; i < img_rgb.rows-1; i++) { for (int j = 1; j < img_rgb.cols-1; j++) { if(255 == img_rgb.at<uchar>(i,j)) { uchar p1 = img_rgb.at<uchar>(i, j); uchar p2 = img_rgb.at<uchar>(i-1, j); uchar p3 = img_rgb.at<uchar>(i-1, j+1); uchar p4 = img_rgb.at<uchar>(i, j+1); uchar p5 = img_rgb.at<uchar>(i+1, j+1); uchar p6 = img_rgb.at<uchar>(i+1, j); uchar p7 = img_rgb.at<uchar>(i+1, j-1); uchar p8 = img_rgb.at<uchar>(i, j-1); uchar p9 = img_rgb.at<uchar>(i-1, j-1); // s = abs(p9-p8)+abs(p8-p7)+abs(p7-p6)+abs(p6-p5)+abs(p5-p4)+abs(p4-p3)+abs(p3-p2)+abs(p2-p9); // if (s == 1530) int same=(p9==p1); same+=(p8==p1); same+=(p7==p1); same+=(p6==p1); same+=(p5==p1); same+=(p4==p1); same+=(p3==p1); same+=(p2==p1); if (same==2) { // cout<<i<<" "<<j<<" " <<same<<endl; circle(img_rgb,Point(i,j),1,Scalar(0, 255, 0),1); } } } } cv::imshow("a",img_rgb); cv::waitKey(); return 0 ; int main(int argc,char**argv) { cv::Mat im=cv::imread(“IMG.jpg”,0); if(im.empty()) 返回-1; cv::Mat img_rgb(im.size(),cv_8UC3); cv::阈值(img_rgb,img_rgb,155,255,cv_THRESH_二进制); cv::CVT颜色(im、img_rgb、cv_GRAY2RGB); int s=0; 对于(int i=1;i_C++_Opencv - Fatal编程技术网

骨架中连接点的提取 我目前在学校的项目中使用OpenCV和C++。我的问题是如何在骨架图像中提取连接点。我曾尝试开发此代码,但它不起作用,我没有发现错误。提前谢谢 int main( int argc, char** argv ) { cv::Mat im = cv::imread("IMG.jpg",0); if (im.empty()) return -1; cv::Mat img_rgb(im.size(), CV_8UC3); cv::threshold(img_rgb, img_rgb, 155, 255, CV_THRESH_BINARY); cv::cvtColor(im, img_rgb, CV_GRAY2RGB); int s=0; for (int i = 1; i < img_rgb.rows-1; i++) { for (int j = 1; j < img_rgb.cols-1; j++) { if(255 == img_rgb.at<uchar>(i,j)) { uchar p1 = img_rgb.at<uchar>(i, j); uchar p2 = img_rgb.at<uchar>(i-1, j); uchar p3 = img_rgb.at<uchar>(i-1, j+1); uchar p4 = img_rgb.at<uchar>(i, j+1); uchar p5 = img_rgb.at<uchar>(i+1, j+1); uchar p6 = img_rgb.at<uchar>(i+1, j); uchar p7 = img_rgb.at<uchar>(i+1, j-1); uchar p8 = img_rgb.at<uchar>(i, j-1); uchar p9 = img_rgb.at<uchar>(i-1, j-1); // s = abs(p9-p8)+abs(p8-p7)+abs(p7-p6)+abs(p6-p5)+abs(p5-p4)+abs(p4-p3)+abs(p3-p2)+abs(p2-p9); // if (s == 1530) int same=(p9==p1); same+=(p8==p1); same+=(p7==p1); same+=(p6==p1); same+=(p5==p1); same+=(p4==p1); same+=(p3==p1); same+=(p2==p1); if (same==2) { // cout<<i<<" "<<j<<" " <<same<<endl; circle(img_rgb,Point(i,j),1,Scalar(0, 255, 0),1); } } } } cv::imshow("a",img_rgb); cv::waitKey(); return 0 ; int main(int argc,char**argv) { cv::Mat im=cv::imread(“IMG.jpg”,0); if(im.empty()) 返回-1; cv::Mat img_rgb(im.size(),cv_8UC3); cv::阈值(img_rgb,img_rgb,155,255,cv_THRESH_二进制); cv::CVT颜色(im、img_rgb、cv_GRAY2RGB); int s=0; 对于(int i=1;i

骨架中连接点的提取 我目前在学校的项目中使用OpenCV和C++。我的问题是如何在骨架图像中提取连接点。我曾尝试开发此代码,但它不起作用,我没有发现错误。提前谢谢 int main( int argc, char** argv ) { cv::Mat im = cv::imread("IMG.jpg",0); if (im.empty()) return -1; cv::Mat img_rgb(im.size(), CV_8UC3); cv::threshold(img_rgb, img_rgb, 155, 255, CV_THRESH_BINARY); cv::cvtColor(im, img_rgb, CV_GRAY2RGB); int s=0; for (int i = 1; i < img_rgb.rows-1; i++) { for (int j = 1; j < img_rgb.cols-1; j++) { if(255 == img_rgb.at<uchar>(i,j)) { uchar p1 = img_rgb.at<uchar>(i, j); uchar p2 = img_rgb.at<uchar>(i-1, j); uchar p3 = img_rgb.at<uchar>(i-1, j+1); uchar p4 = img_rgb.at<uchar>(i, j+1); uchar p5 = img_rgb.at<uchar>(i+1, j+1); uchar p6 = img_rgb.at<uchar>(i+1, j); uchar p7 = img_rgb.at<uchar>(i+1, j-1); uchar p8 = img_rgb.at<uchar>(i, j-1); uchar p9 = img_rgb.at<uchar>(i-1, j-1); // s = abs(p9-p8)+abs(p8-p7)+abs(p7-p6)+abs(p6-p5)+abs(p5-p4)+abs(p4-p3)+abs(p3-p2)+abs(p2-p9); // if (s == 1530) int same=(p9==p1); same+=(p8==p1); same+=(p7==p1); same+=(p6==p1); same+=(p5==p1); same+=(p4==p1); same+=(p3==p1); same+=(p2==p1); if (same==2) { // cout<<i<<" "<<j<<" " <<same<<endl; circle(img_rgb,Point(i,j),1,Scalar(0, 255, 0),1); } } } } cv::imshow("a",img_rgb); cv::waitKey(); return 0 ; int main(int argc,char**argv) { cv::Mat im=cv::imread(“IMG.jpg”,0); if(im.empty()) 返回-1; cv::Mat img_rgb(im.size(),cv_8UC3); cv::阈值(img_rgb,img_rgb,155,255,cv_THRESH_二进制); cv::CVT颜色(im、img_rgb、cv_GRAY2RGB); int s=0; 对于(int i=1;i,c++,opencv,C++,Opencv,您正在设置img_rgb的阈值,此时它是空的 还有,为什么要再次将灰度转换为rgb? (顺便说一句,如果在rgb图像上循环,mat.at(y,x)是错误的,应该是mat.at(y,x)) 我想说,跳过灰度2RGB转换,而是对加载的灰度图像设置阈值: cv::Mat im = cv::imread("IMG.jpg",0); if (im.empty()) return -1; cv::Mat thresh; cv::threshold(im, thresh, 155, 255, CV_

您正在设置img_rgb的阈值,此时它是空的

还有,为什么要再次将灰度转换为rgb? (顺便说一句,如果在rgb图像上循环,
mat.at(y,x)
是错误的,应该是
mat.at(y,x)

我想说,跳过灰度2RGB转换,而是对加载的灰度图像设置阈值:

cv::Mat im = cv::imread("IMG.jpg",0);
if (im.empty())
    return -1;

cv::Mat thresh;
cv::threshold(im, thresh, 155, 255, CV_THRESH_BINARY);
然后使用该垫子进行进一步处理:

for (int i = 1; i < thresh.rows-1; i++)
{
    for (int j = 1; j < thresh.cols-1; j++)
    {
        uchar p1 = thresh.at<uchar>(i, j);
        if(255 == p1)
        {   
             uchar p2 = thresh.at<uchar>(i-1, j);
             uchar p3 = thresh.at<uchar>(i-1, j+1);

             // ...
for(int i=1;i