C言語 OpenCVの画像処理について困っています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぱんだ

C言語 OpenCVの画像処理について困っています。

#1

投稿記事 by ぱんだ » 8年前

OpenCVで画像内の四角形(長方形)をアーチ状の形に変形する方法で悩んでいます。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#2

投稿記事 by C6b14 » 8年前

Forum ルールに則って問題点の短いコードを提示する必要があります。(再現出来ません...。)
[具体的にどうしたいかによって方法は千変万化します...。]
[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々

[3] その他
 ・どの程度C言語を理解しているか
 ・ライブラリを使っている場合は何を使っているか

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語 OpenCVの画像処理について困っています。

#3

投稿記事 by みけCAT » 8年前

ぱんだ さんが書きました:C言語 OpenCVの画像処理について困っています。
OpenCVで画像内の四角形(長方形)をアーチ状の形に変形する方法で悩んでいます。
これは現状を報告しているだけで、質問には見えません。
ユーザー登録していただくと、日記を投稿できるようになります。
雑談トピを立てる場合は、わかりやすいように件名の最後に[雑談]と入れるべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ぱんだ

Re: C言語 OpenCVの画像処理について困っています。

#4

投稿記事 by ぱんだ » 8年前

これは大変失礼しました。

[1] 質問文
   画像内の一部をアーチ状に変形させるにはどのようにすればよいですか?
 [1.1] 自分が今行いたい事は何か
     画像内に背景白、黒で文字や物体がある場合に黒の部分だけの外接矩形座標(minx,miny,maxx,maxy)を求め、その範囲内を逆アーチ状に変形することです。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
     画像を取り込み画像内の黒い部分を調べ黒い部分のxy最小最大値を求めました。
     以降どのような操作をするべきか分からない状態です。
     以下は作成したコードです。
[code=Cpp]
#pragma comment(lib, "opencv_world300.lib")

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
Mat input = imread("画像ファイル.png");

int w = input.cols; // 幅
int h = input.rows; // 高さ

// デバッグ用
Mat output;
output.create(input.size(), CV_8UC3);

//
// 1. 外接矩形(minx,miny)-(maxx,maxy)を求める//
int minx = w-1;
int maxx = 0;
int miny = h-1;
int maxy = 0;
for(int y =0; y < h; y++)
for(int x =0; x < w; x++) {
const int index = (y*w+x)*3;
// 輝度i
const int i = (input.data[index+0]+input.data[index+0]+input.data[index+0])/3;
if (i<30) {
// 黒画素 debug
output.data[index+2] = 255;
output.data[index+1] = 0;
output.data[index+0] = 0;

// 最大最小の更新
if (minx > x) minx = x;
if (miny > y) miny = y;
if (maxx < x) maxx = x;
if (maxy < y) maxy = y;
}
else { // debug
output.data[index+2] = 255;
output.data[index+1] = 255;
output.data[index+0] = 255;
}
}
 }
printf("%d %d %d %d\n", minx,maxx,miny,maxy);
waitKey();
return 0;
}
[/code]
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
     4点を求めた後の変形方法が分かりません。
 [1.4] 今何がわからないのか、知りたいのか
     求めた4点内の範囲をアーチ状に変形する方法です。
 
[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : OpenCV C++

[3] その他
 ・どの程度C言語を理解しているか
  学び始めて3か月程です。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#5

投稿記事 by C6b14 » 8年前

コードは”「code」「code」”で囲むこと(albumのうえのコードボタン使用)。いまみたらコンパイルすらできない。正しいコードなのか?
(他の質問を参考に再送)

コード:

printf("%d %d %d %d\n", minx, maxx, miny, maxy); 
waitKey();
それから”(画像ファイル.png”を送ること。及び完成時の予想図を提示しないと自分だけわかっても他人に説明なくてはできないはず。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語 OpenCVの画像処理について困っています。

#6

投稿記事 by みけCAT » 8年前

C6b14 さんが書きました:コードは”「code」「code」”で囲むこと(albumのうえのコードボタン使用)。
引用してそのままプレビューしたらハイライトが効いたので、タグ自体は正しいようですね。
codeタグで囲んでもBBCodeを無効にしてしまうと意味がないので、無効にしてはいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#7

投稿記事 by C6b14 » 8年前

明らかに"全角空白文字”が含まれている。コードを正しく送るようにしてください。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語 OpenCVの画像処理について困っています。

#8

投稿記事 by みけCAT » 8年前

C6b14 さんが書きました:いまみたらコンパイルすらできない。
少なくとも、
  • あってはいけない場所に全角スペースがある
  • {に対応していない}がある (for(int y =0; y < h; y++) の後に{があるべき?)
という問題がありますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#9

投稿記事 by C6b14 » 8年前

その2か所を訂正してエラーはなくなりました。ビルド時にVersinが違うと思われる(.hppのエラーがたくさん出た)現象があります。OpenCV3.1です。OpenCVはVersinが違うと動かないことが多いです。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#10

投稿記事 by C6b14 » 8年前

ここhttp://opencv.jp/cookbook/opencv_img.html#id20にある”外接矩形”は動きます。

コード:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
	cv::Size img_size(500, 500);
	cv::Mat img = cv::Mat::zeros(img_size, CV_8UC3);

	// 一様分布乱数で座標を生成
	const int rand_num = 50;
	cv::Mat_<int> points(rand_num, 2);
	cv::randu(points, cv::Scalar(100), cv::Scalar(400));
	for (int i = 0; i<rand_num; ++i) {
		// 座標に点を描画
		cv::circle(img, cv::Point(points(i, 0), points(i, 1)), 2, cv::Scalar(200, 200, 0), -1, CV_AA);
	}

	// CV_*C2型のMatに変換してから,外接矩形を計算
	cv::Rect brect = cv::boundingRect(cv::Mat(points).reshape(2));
	// 外接矩形を描画
	cv::rectangle(img, brect.tl(), brect.br(), cv::Scalar(100, 100, 200), 2, CV_AA);

	cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::imshow("image", img);
	cv::waitKey(0);
}

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#11

投稿記事 by C6b14 » 8年前

[雑談](VisualStudioの”ソリューションのNuGetパッケージの管理”を使えば何もしなくても全自動でOpenCVのインストール/ アンインストールが繰り返しできます。)Versinがの変更の可能だと思うのですが。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#12

投稿記事 by C6b14 » 8年前

//#pragma comment(lib, "opencv_world300.lib")としたらOpenCV3.1で正常動作しました。
画像なし("画像ファイル.png")でこんな表示です。

コード:

***** VIDEOINPUT LIBRARY - 0.1995 - TFW07 *****

-1 0 -1 0
続行するには何かキーを押してください . . .

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#13

投稿記事 by C6b14 » 8年前

「コード」は送ってもらはなくていいです。

コード:

//#pragma comment(lib, "opencv_world300.lib")<ー:コメントアウト

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>
#include <cstdio>
#include <cstring>
//#include <stdio.h>
using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat input = imread("画像ファイル.png");

	int w = input.cols; // 幅
	int h = input.rows; // 高さ

						// デバッグ用
	Mat output;
	output.create(input.size(), CV_8UC3);

	// 
	// 1. 外接矩形(minx,miny)-(maxx,maxy)を求める// 
	int minx = w - 1;
	int maxx = 0;
	int miny = h - 1;
	int maxy = 0;
	for (int y = 0; y < h; y++) {
		for (int x = 0; x < w; x++) {
			const int index = (y*w + x) * 3;
			// 輝度i
			const int i = (input.data[index + 0] + input.data[index + 0] + input.data[index + 0]) / 3;
			if (i < 30) {
				// 黒画素 debug
				output.data[index + 2] = 255;
				output.data[index + 1] = 0;
				output.data[index + 0] = 0;

				// 最大最小の更新
				if (minx > x) minx = x;
				if (miny > y) miny = y;
				if (maxx < x) maxx = x;
				if (maxy < y) maxy = y;
			}
			else { // debug
				output.data[index + 2] = 255;
				output.data[index + 1] = 255;
				output.data[index + 0] = 255;
			}
		}

	}
	printf("%d %d %d %d\n", minx, maxx, miny, maxy);
	waitKey();
	return 0;
}

C614b

Re: C言語 OpenCVの画像処理について困っています。

#14

投稿記事 by C614b » 8年前

ここhttp://opencv.jp/cookbook/opencv_img.htmlある画像でいいなら指定してくだされば取り込みますよ。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#15

投稿記事 by C6b14 » 8年前

画像も他もいらないですよ。”四角形(長方形)をアーチ状の形に変形する方法”が具体的になにをもとにどんな風にやりたいかを説明頂ければいいと思います。

ぱんだ

Re: C言語 OpenCVの画像処理について困っています。

#16

投稿記事 by ぱんだ » 8年前

自分が書いたコード自体も問題だらけだったみたいですね。
申し訳ないです。

実現したい画像変形は具体的にはアーチ状(曲がった)物体の修正です。
画像内のアーチ状の文字や絵を外接矩形で囲み逆方向に曲げてやれば元の物体をまっすぐに修正できるのではないかと考えプログラムしています。

例としてはWordなどでできる文字の効果「上アーチ」または「下アーチ」を元の横一直線文字に戻すような変形がしたいのです。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#17

投稿記事 by C6b14 » 8年前

十分デバッグしてから送ってくだい!。OpenCVで図形の描画のプログラムは出来ていますか。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#18

投稿記事 by C6b14 » 8年前

Wordのその機能はよく使いますがプログラムで実装するには高度な数学の知識もいるしアルゴリズムも大変です。なにか具体的な目的についての方法論であれば良いのですが抽象論的すぎます。

C6b14

Re: C言語 OpenCVの画像処理について困っています。

#19

投稿記事 by C6b14 » 8年前

そういえばたしかにOpenCVで”矩形領域をマウスのドラッグで変形”させてました。似ているので参考にはなるかもしれません。
http://dixq.net/forum/viewtopic.php?f=3&t=18570

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C言語 OpenCVの画像処理について困っています。

#20

投稿記事 by usao » 8年前

やりたいことはcvLogPolar()みたいなことでしょうか.

閉鎖

“C言語何でも質問掲示板” へ戻る