私は以下のイメージを持っています。このオブジェクトを2つに分割する線を検出したいと思います。どちらが最善の方法ですか?私はハフ変換を試しましたが、オブジェクトが検出するのに十分ではない場合があります。どんなイデオリア?オブジェクトでOpencvを検出する
ありがとうございます!
私は以下のイメージを持っています。このオブジェクトを2つに分割する線を検出したいと思います。どちらが最善の方法ですか?私はハフ変換を試しましたが、オブジェクトが検出するのに十分ではない場合があります。どんなイデオリア?オブジェクトでOpencvを検出する
ありがとうございます!
通常、ハフ変換は、ライン検出のために使用されます。
しかし、それがあなたのために働かないなら、フィッティングラインもいいです。
詳細とパラメータについては、OpenCV fitlineの機能を確認してください。
すでにハフラインを試してみましたので、私はOpenCVの-のPythonを使用して、ここでフィッティングラインのデモンストレーションを行います:
を:以下# Load image, convert to grayscale, threshold and find contours
img = cv2.imread('lail.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
# then apply fitline() function
[vx,vy,x,y] = cv2.fitLine(cnt,cv2.cv.CV_DIST_L2,0,0.01,0.01)
# Now find two extreme points on the line to draw line
lefty = int((-x*vy/vx) + y)
righty = int(((gray.shape[1]-x)*vy/vx)+y)
#Finally draw the line
cv2.line(img,(gray.shape[1]-1,righty),(0,lefty),255,2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
私が得た結果であり、
編集:
オブジェクトを2つの部分に分割する行を検索するには、まずフィッティング行を見つけてから、それに垂直な行を探します。そのために
、cv2.fitLine()関数の下でコードの一部の下に追加します。
希望:
nx,ny = 1,-vx/vy
mag = np.sqrt((1+ny**2))
vx,vy = nx/mag,ny/mag
そして以下は、私が得た結果は、助けになる !!!
UPDATE:以下
あなたが要求したとして、最初の例PythonコードのためのC++のコードです。コードはうまく動作します。上に示したように、出力は同じです。
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv/cv.h>
using namespace std;
using namespace cv;
int main()
{
cv::Mat img, gray,thresh;
vector<vector<Point>> contours;
Vec4f lines;
img = cv::imread("line.png");
cv::cvtColor(img,gray,cv::COLOR_BGR2GRAY);
cv::threshold(gray,thresh,127,255,cv::THRESH_BINARY);
cv::findContours(thresh,contours,cv::RETR_LIST,cv::CHAIN_APPROX_SIMPLE);
cv::fitLine(Mat(contours[0]),lines,2,0,0.01,0.01);
//lefty = int((-x*vy/vx) + y)
//righty = int(((gray.shape[1]-x)*vy/vx)+y)
int lefty = (-lines[2]*lines[1]/lines[0])+lines[3];
int righty = ((gray.cols-lines[2])*lines[1]/lines[0])+lines[3];
cv::line(img,Point(gray.cols-1,righty),Point(0,lefty),Scalar(255,0,0),2);
cv::imshow("img",img);
cv::waitKey(0);
cv::destroyAllWindows();
}
はどうもありがとうございました、私は今日、これをしようとします:D ああ、私はあなたのブログのファンです:) –
あなたはC++のためのいずれかのバージョンを持っていますか? :P –
こんにちは、すべての機能はOpenCVの標準機能です。したがって、opencvドキュメントをチェックすると、私が使用したすべてのPython関数に対応するC++関数が見つかります。自分で試してみてください。何か問題が見つかった場合は、私にコメントしてください。私は助けようとします... –